如何在bash脚本中无需确认直接删除MySQL数据库?
我写了一个bash脚本,流程是先导出现有数据库备份,再基于备份创建一个不同名称的测试副本。测试完成后需要删除这个副本数据库。
目前脚本里用这个命令删除副本:
mysql -h"$HOST" -P"$PORT" -u"$ROOT_USER" -p"$DB_PW" -e "drop database $DB_COPY"
这个命令能成功删库,但每次都会弹出Enter password:的密码提示。虽然我知道删库有风险,但这个场景下完全不需要确认,想强制无提示删除。
我也试过这个命令,结果一样:
mysqladmin -h"$HOST" -P"$PORT" -u"$ROOT_USER" -p"$DB_PW" -e "drop database $DB_COPY"
查了MySQL手册,加了-f选项,不管是mysql还是mysqladmin命令,还是会弹出密码提示。但直接在shell里执行带-f的第二个命令时,就不会有提示。脚本是用root用户运行的,排除系统提示的可能,提示内容就是:
Enter password:
还试过用管道传yes,结果还是有提示:
yes | mysqladmin -h"$HOST" -P"$PORT" -u"$ROOT_USER" -p"$DB_PW" -f drop "$DB_COPY"
有没有办法绕过这个密码提示直接删库?或者指出提示来源怎么抑制?
1. 修正密码参数的写法
MySQL的-p参数后面不能加空格,如果你的写法是-p "$DB_PW"(带空格),或者$DB_PW变量为空/包含特殊字符,就会触发密码提示。正确的写法是把密码直接跟在-p后面,不要空格:
mysql -h"$HOST" -P"$PORT" -u"$ROOT_USER" -p"$DB_PW" -e "DROP DATABASE IF EXISTS $DB_COPY;"
或者用--password="$DB_PW"的长格式写法,这个允许空格,对特殊字符兼容性更好:
mysql -h"$HOST" -P"$PORT" -u"$ROOT_USER" --password="$DB_PW" -e "DROP DATABASE IF EXISTS $DB_COPY;"
2. 用my.cnf配置文件实现免密
在脚本运行用户的家目录(比如root的/root/.my.cnf)创建配置文件,写入数据库认证信息:
[mysql] host = $HOST port = $PORT user = $ROOT_USER password = $DB_PW [mysqladmin] host = $HOST port = $PORT user = $ROOT_USER password = $DB_PW
然后给文件设置严格权限,避免密码泄露:
chmod 600 /root/.my.cnf
之后脚本里的命令可以简化成:
mysql -e "DROP DATABASE IF EXISTS $DB_COPY;" # 或者用mysqladmin mysqladmin drop "$DB_COPY" -f
3. 确认变量是否正确展开
脚本里可能存在变量未正确解析的情况,比如$DB_PW包含特殊字符(!、@、$等)导致shell转义问题。可以在脚本里加一行调试代码,验证变量内容:
echo "当前使用的密码:$DB_PW"
如果密码有特殊字符,建议用单引号包裹变量,或者直接使用--password="$DB_PW"的长格式。
4. 配合IF EXISTS避免不必要报错(可选)
在DROP命令里加上IF EXISTS,即使数据库不存在也不会报错,配合-f选项可以让脚本更稳健:
mysql -h"$HOST" -P"$PORT" -u"$ROOT_USER" -p"$DB_PW" -e "DROP DATABASE IF EXISTS $DB_COPY;" -f
内容的提问来源于stack exchange,提问作者mash

