执行SQL查询
我想编写一个脚本,从文件中读取行包含:在同一执行SQL查询
- SQL脚本的文件名,并
- 一些SQL查询行
并启动查询。
有一个list.txt
文件的格式如下:
query.sql; set @var:='prod';
其中query.sql
是SQL查询文件,如:
select *
from db
where [email protected]
我想编写一个执行的一个bash脚本像这样的查询:
mysql -uroot -proot -e
"set @var:='prod';
select *
from db
where [email protected];"
这是我试过的到目前为止:
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 [email protected] ;
如何调整的代码,以便有
$echo $app
$set @var:='prod'; select * from db where [email protected] ;
?
进一步详情
有一个在awk
命令loop
,因为文件list.txt
可能包含多个查询,如:
query.sql; set @var:='prod'; @a=asd; @b=zxc, @...=...;
我不认为你需要阅读的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文件。
错误的原因
你的代码没有正确的SQL传递给MySQL客户端,因为这行:
mysql -uroot -proot -e "`echo $app`"
外壳解释$app
变量中的特殊字符。特别是,*
字符被扩展为“当前目录中的每个文件”。为了防止解释,使用弱quoting,即封闭变量在双引号:"$app"
:
当引用一个变量,它通常建议用双引号括它的名字。这可以防止的引用字符串中的所有特殊字符重新解释 - 除了
$
,(反引号),并\
(越狱)...保持
$
为双引号内的特殊字符允许引用引用变量("$variable"
)也就是说,其值替换变量
而且,不需要子shell表达式(反引号和echo
),如果你想获得的变量值:
mysql -uroot -proot -e "$app"
'awk -F \; '{for(i = 2; i
是的你是对的,我正在修改我自己的,它的工作原理! Great –
为了更好地理解bash脚本(我是新手),你知道我的代码中哪个是问题吗? –
我的错误,只是编辑了问题(这是我在服务器上的真实查询) –
@AlessandroBlasetti,你想要执行第二个SQL语句(在第一个';'之后),然后在第一个';',对吗? –
@RuslanOsmanov我想执行我的最后一行:'set @var:='prod'; select * from db where system = @ var;' –