我正在尝试编写一个脚本,该脚本从包含以下内容的文件中读取行:
并启动查询。
有一个list.txt
文件,格式如下:
query.sql; set @var:='prod';
其中query.sql
是带有SQL查询的文件,例如:
select *
from db
where system=@var
我正在尝试编写一个执行如下查询的Bash脚本:
mysql -uroot -proot -e
"set @var:='prod';
select *
from db
where system=@var;"
这是我到目前为止所尝试的内容:
while read line;
do app=$(echo $line | awk '{for (i=2; i <= NF; i++) printf FS$i; print NL }';
cat `echo $line | awk -F\; '{print $1}'`; echo ";");
mysql -uroot -proot -e "`echo $app`"
done < list.txt
但是我遇到了SQL错误,因为shell不能很好地转义*
中的query.sql
字符。
调试我获得的代码:
$echo $app
$set @var:='prod'; select a list.txt mysql query1.sql query.sql from db where system=@var ;
如何调整代码才能拥有
$echo $app
$set @var:='prod'; select * from db where system=@var ;
更多详情
loop
命令中有awk
,因为文件list.txt
可能包含多个查询,例如:
query.sql; set @var:='prod'; @a=asd; @b=zxc, @...=...;
答案 0 :(得分:2)
我认为你不需要逐行阅读SQL文件。假设文件名中没有分号,您可以使用以下AWK命令构造查询:
awk -F\; '{
for (i = 2; i <= NF; i++) {
if ($i != "") printf("%s;", $i);
}
printf("source %s;\n", $1)
}' list.txt | mysql -uroot -proot
该命令使用;
作为字段分隔符。 for
循环打印从第二个开始的所有字段。最后一个printf
函数构建了一个查询源文件。
错误原因
由于以下行,您的代码无法将正确的SQL传递给MySQL客户端:
mysql -uroot -proot -e "`echo $app`"
shell解释$app
变量中的特殊字符。特别是,*
字符被扩展为&#34;当前目录中的每个文件&#34;。要防止解释,请使用弱quoting ,即将变量括在双引号中:"$app"
:
引用变量时,通常建议将其名称括在双引号中。这可以防止重新解释引用字符串中的所有特殊字符 - 除
$
,(反引号)和\
(转义)...将
$
保留为双引号内的特殊字符允许引用引用变量("$variable"
),即用其值替换变量
此外,如果您想获取变量的值,则不需要子shell表达式(反引号和echo
):
mysql -uroot -proot -e "$app"