2016-11-18 4 views
0

У меня есть команда MySQL в сценарии bash, в котором я запущен. Я бегу другой командной строки Linux команды перед этим (на самом деле один даже команда MySQL), но, когда он попадает в этот, он не работает:Bash Script не работает Команда MySQL

DEST_HOST="localhost" 
DEST_DBNAME="db_name" 
DEST_DBUSER="root" 
DEST_DBPASS="" 

# FILE NAME 
MIGRATION_FILE="migration_database" 

# Export/Import Commands 
DO_DATABASE_UPDATE="mysql --host=$SOURCE_HOST --user=$DEST_DBUSER --password $DEST_DBNAME < $MIGRATION_FILE.sql" 

echo 'Running local updates...' 
$DO_DATABASE_UPDATE 

echo "$DO_DATABASE_UPDATE" 

# Done! 
echo "Complete!" 

У меня есть файл migration_database.sql в которую я запускаю. Как вы можете видеть, я печатаю команду UPDATE в конце всего. Случается, что я запускаю это, и он просто печатает в меню mysql, как я запустил mysql -I, чтобы получить меню справки.

Если я копирую и вставляю команду, которая распечатана и запускает ее, она отлично работает. Я не уверен, почему bash не выполняет это из скрипта.

Любые идеи?

ответ

1
... --password $DEST_DBNAME 

Вы не передадите ваш пароль базы данных. Вы просто используете опцию --password без аргумента, а это значит, «попросите меня ввести пароль». Если вы запустите этот скрипт в неинтерактивной оболочке, вы никогда не увидите приглашение.

Вы можете установить пароль в качестве аргумента:

... --password='$DEST_DBPASS' $DEST_DBNAME 

Или на самом деле то, что я рекомендовал бы, что вы не переводите имя пользователя & пароль в командной строке на всех, потому что это не очень хорошая безопасность привычка.

Вместо этого введите имя пользователя и пароль в файл конфигурации и сообщите своей команде, чтобы использовать этот файл конфигурации.

DO_DATABASE_UPDATE="mysql --defaults-extra-file=$HOME/migration.cnf $DEST_DBNAME < $MIGRATION_FILE.sql" 

В вашем migration.cnf:

[client] 
host = localhost 
user = root 
password = xxxxxxxx 

Если вы используете MySQL 5.6 или более поздней версии, вы должны также узнать о mysql_config_editor, так что вы можете хранить эти учетные данные в зашифрованном файле.


Re ваш комментарий:

Есть ли какой-то вопрос, используя меньше, чем знак в команде в переменной баш?

Да, есть проблема. Кажется, порядок оценки в перенаправлении процессов оболочки до расширения переменной. Приношу свои извинения за то, что не заметил этого раньше.

Если бы я писал сценарий, я написал бы это ни так:

DO_DATABASE_UPDATE="mysql ...opts..." 
echo 'Running local updates...' 
$DO_DATABASE_UPDATE $DEST_DBNAME < $MIGRATION_FILE.sql 

Или еще так:

DO_DATABASE_UPDATE="mysql ...opts... $DEST_DBNAME -e 'source $MIGRATION_FILE.sql'" 
echo 'Running local updates...' 
$DO_DATABASE_UPDATE 
+0

Я бегу его от Терминал на моем Mac, поэтому я предполагаю, что это почему-то не подсказывает мне? Это определенно будет проблемой, я не понимал, что это так. Я обязательно попробую это. Мне нравится решение conf-файла. Я дам вам знать, что я найду, когда вернусь к своему компьютеру. Спасибо за быстрый ответ! – MillerMedia

+0

Я снова играю с этим, и он не хочет запускать сценарий обновления. Он будет работать до символа '<', но затем не работает. Если я сломаю его из объявления переменной, он будет работать или если я остановлю объявление переменной в '' 'и сделаю это как' $ DO_DATABASE_UPDATE <$ MIGRATION_FILE.sql', это сработает. Есть ли проблема с использованием знака меньше чем в команде в переменной bash? – MillerMedia

1

MySQL Command С Bash Shell в одной строке

Используйте следующую команду для быстрого выполнения запроса MySQL из оболочки Linux Bash: # mysql -u [user] -p [pass] -e "[mysql commands]"

Пример:

# mysql -u root -pSeCrEt -e "show databases" 

Запуск MySQL Query Из Bash сценария с помощью ВФ Используйте следующий синтаксис в ваших Bash скрипты для запуска MySQL команды:

mysql -u [user] -p[pass] << EOF 
[mysql commands] 
EOF 

Пример:

#!/bin/bash 
mysql -u root -pSeCrEt << EOF 
use mysql; 
show tables; 
EOF 

Выполнение команды MySQL удаленно Используйте опцию -h указать IP-адрес сервера MySQL в:

# mysql -h [ip] -u [user] -p[pass] -e "[mysql commands]" 

Пример:

# mysql -h 192.168.1.10 -u root -pSeCrEt -e "show databases" 

Укажите базу данных для использования

Use -D option to specify the name of MySQL database : 
# mysql -D [db name] -u [user] -p[pass] -e "[mysql commands]" 

Пример:

# mysql -D clients -u root -pSeCrEt -e "show tables" 
Смежные вопросы