执行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, @...=...; 
+0

我的错误,只是编辑了问题(这是我在服务器上的真实查询) –

+0

@AlessandroBlasetti,你想要执行第二个SQL语句(在第一个';'之后),然后在第一个';',对吗? –

+0

@RuslanOsmanov我想执行我的最后一行:'set @var:='prod'; select * from db where system = @ var;' –

我不认为你需要阅读的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" 
+0

'awk -F \; '{for(i = 2; i

+0

是的你是对的,我正在修改我自己的,它的工作原理! Great –

+0

为了更好地理解bash脚本(我是新手),你知道我的代码中哪个是问题吗? –