如何将SQL脚本作为参数传入Bash脚本?报错解决
解决Bash脚本传入带引号SQL参数的报错问题
这个问题我碰到过不少次,核心是Bash的参数解析规则在搞鬼,咱们一步步拆解解决:
问题根源
你在脚本里调用Unload.py时,写的是-s $3,这里的$3没有被双引号包裹。Bash会对未加引号的变量做两件关键操作:
- 单词拆分:把SQL里的空格作为参数分隔符,导致原本完整的SQL被拆成多个零散参数传给
Unload.py - 路径扩展:SQL里的
*会被Bash替换成当前目录下的所有文件名,完全打乱了SQL的结构
这两个操作直接导致Unload.py收到的SQL参数完全不符合预期,自然会报错。
解决方案
修改你的Bash脚本,给所有变量引用加上双引号,确保参数作为完整字符串传递:
修改后的脚本:
#!/bin/bash if [ $# -lt 3 ]; then echo "Usage: databasename, tablename, script" exit 1 fi export DB="$1" export PWD=absc /research/util/Unload.py -e -d "|" -t "$2" -c "MM/DD/YYYY" -s "$3"
重点改动说明:
export DB="$1":给数据库名参数加双引号(虽然一般数据库名没空格,但这是良好的编程习惯)-t "$2":给表名参数加双引号,避免表名包含特殊字符时出问题-s "$3":给SQL脚本参数加双引号,这是解决当前报错的核心!
执行脚本的正确方式
你当前的执行命令是没问题的:
./UnloadToInfx.sh "db_name" "mytable" "select * from mytable where city='LA' and date='05/22/2018'"
外层用双引号包裹整个SQL,里面的单引号不需要转义,因为双引号内的单引号会被Bash当作普通字符处理,不会引发解析冲突。
额外提示
如果你的SQL里包含双引号(比如字符串里有双引号),那执行时需要转义,或者改用单引号包裹整个SQL,同时把SQL里的单引号转义成''(Bash里单引号内的单引号用两个单引号表示)。比如:
./UnloadToInfx.sh "db_name" "mytable" 'select * from mytable where city=''LA'' and date=''05/22/2018'' and note="test"'
内容的提问来源于stack exchange,提问作者zoeylong
相关产品推荐
相关产品推荐

