我在运行的bash脚本中有一个MySQL命令。我在这之前运行其他Linux命令行命令(实际上一个甚至是一个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不会在脚本中执行此操作。
有什么想法吗?
答案 0 :(得分:1)
... --password $DEST_DBNAME
您没有传递数据库密码。您只需使用--password
选项,不带参数,这意味着“提示我输入密码”。如果您在非交互式shell中运行此脚本,则永远不会看到提示。
您可以将密码设置为参数:
... --password='$DEST_DBPASS' $DEST_DBNAME
或者实际上我推荐的是你没有把你的用户名和&amp;命令行上的密码,因为这不是一个好的安全习惯。
相反,将用户名和密码放在配置文件中,并告诉您的命令使用该配置文件。
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
答案 1 :(得分:1)
一行中的Bash Shell的MySQL命令
使用以下命令从Linux Bash Shell快速执行MySQL查询: #mysql -u [user] -p [pass] -e“[mysql命令]”
示例:
# mysql -u root -pSeCrEt -e "show databases"
使用EOF从Bash脚本运行MySQL查询 在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"