使用特殊格式的文件执行SQL查询

时间:2016-11-22 14:23:15

标签: mysql bash awk

我正在尝试编写一个脚本,该脚本从包含以下内容的文件中读取行:

  • SQL脚本的文件名,
  • 同一行上的一些SQL查询

并启动查询。

有一个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, @...=...;

1 个答案:

答案 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"