通过Bash脚本执行SQL文件报错:未知数据库'/root/file.sql'求排查
问题原因及解决方法
问题原因
在Bash脚本中将带引号的命令存入变量后直接执行时,Bash的分词机制会忽略变量内部的单引号,将其视为普通字符。这导致MySQL收到的参数被错误拆分:--execute='source被当作一个独立参数,/root/file.sql'被当作另一个参数,而MySQL会把这个额外参数识别为要连接的数据库名,由于不存在名为'/root/file.sql'的数据库,因此抛出ERROR 1049 (42000): Unknown database '/root/file.sql''错误。
解决方法
提供以下几种可行方案,按推荐优先级排序:
方案1:用重定向直接读取SQL文件(最简洁可靠)
避免--execute的引号解析问题,直接通过重定向让MySQL读取SQL文件内容:
#!/bin/bash output=$(mysql --user=root --password=root --host=localhost testdb < /root/file.sql) rc="$?"
这里将testdb作为数据库参数放在命令末尾,用< /root/file.sql把文件内容传入MySQL执行。
方案2:用数组存储命令参数(安全规范)
通过数组存储命令的每个参数,能正确保留参数边界,避免分词错误:
#!/bin/bash v_command=(mysql --user=root --password=root --host=localhost --database=testdb --execute='source /root/file.sql') echo "COMMAND: ${v_command[*]}" output=$("${v_command[@]}") rc="$?"
方案3:使用eval重新解析变量命令
eval会重新处理变量中的引号,让MySQL正确识别完整参数:
#!/bin/bash v_command="mysql --user=root --password=root --host=localhost --database=testdb --execute='source /root/file.sql'" echo "COMMAND: $v_command" eval $v_command rc="$?"
方案4:直接执行命令(无需变量存储)
如果不需要把命令存入变量,直接写执行语句即可:
#!/bin/bash output=$(mysql --user=root --password=root --host=localhost --database=testdb --execute='source /root/file.sql') rc="$?"
内容的提问来源于stack exchange,提问作者Raul Kaubi
相关产品推荐
相关产品推荐

