2016-11-18 232 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"