You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:30:06