Shell脚本执行含*的SQL查询时避免通配符解析的方法
解决Shell脚本中SQL语句
*被解析为目录文件的问题 核心原因
你碰到的问题是Shell的**路径名扩展(globbing)**机制导致的:当直接使用echo $QUERY或者不带引号传递变量时,Shell会把未被引号包裹的*当成通配符,自动替换成当前目录下的所有文件名,直接破坏了原本的SQL语句结构。
可行解决方案
1. 引用变量时加双引号
这是最直接的修复方式。不管是打印变量还是执行SQL,只要用双引号包裹变量,Shell就只会完成变量替换,不会触发路径名扩展:
# 正确打印变量内容(*会被原样保留) echo "$QUERY" # 正确执行SQL(以mysql客户端为例) mysql -u your_username -p your_password -D your_database -e "$QUERY"
2. 直接用Here-Doc传递SQL给数据库客户端
如果不需要把SQL保存到变量里,完全可以跳过变量赋值步骤,直接将Here-Doc内容传给数据库命令,彻底绕开Shell的扩展问题:
mysql -u your_username -p your_password -D your_database <<EOF insert into table1 select * from table2; EOF
3. 用单引号定义变量(可选)
如果一定要用变量存储SQL,也可以用单引号直接定义(注意单引号内部不能包含单引号字符),这样变量里的*会被原样保留:
QUERY='insert into table1 select * from table2;' # 执行时同样要加双引号引用变量 mysql -e "$QUERY"
内容的提问来源于stack exchange,提问作者Akanksha_p
相关产品推荐
相关产品推荐

