2016-11-18 199 views
0

我在運行的bash腳本中有一個MySQL命令。我跑其它Linux命令行這一個(其實是一個連mysql命令)命令前,但是當它到達這一個,這是行不通的:Bash腳本沒有運行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選項而不帶參數,這意味着「提示我輸入密碼」。如果您在非交互式shell中運行此腳本,則永遠不會看到提示。

您可以設置密碼作爲參數:

... --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這樣你就可以存儲在加密文件的帳戶憑據。


回覆您的評論:

是否有一個bash變量使用小於號命令中的一些問題?

是的,有一個問題。這似乎是在變量擴展之前的shell進程重定向中的評估順序。我很抱歉沒有注意到這一點。

如果我寫你的劇本我會這樣寫,要麼:

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命令從Bash shell中一行

使用以下命令從Linux Bash Shell快速執行MySQL查詢: #mysql -u [user] -p [pass] -e「[mysql commands]」

例子:

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

運行MySQL查詢從bash腳本使用EOF 使用以下語法在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選項指定MySQL服務器的IP地址:

# 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"