mysql从bash脚本中的文件中读取select语句的一部分

时间:2015-02-23 23:33:17

标签: mysql bash import

我有一个MySQL查询,我需要在bash脚本中多次运行 它有很长的正则表达式列表 我想避免在脚本中多次重复长列表 代码:

select * from tableName where fieldName regexp concat(
... big long list of regular expressions ...
);

下一个MySQL命令将有不同的选择标准 而其他MySQL命令将删除而不是选择 但正则表达式列表保持不变 我尝试使用bash source命令,但MySQL解释了这一点,所以我认为这必须是一个MySQL命令 那么......我怎么能这样做......

select * from tableName where fieldName regexp concat(
[import regular expression list from file]
);

提前致谢。
更新 - bash尝试:

SCRIPT1:

#!/bin/bash
mysql -uusername -ppassword -D dbname -e "select * from tablename where fieldname regexp concat(
source /scripts/script2
);"

SCRIPT2:

'cat|',
'dog|',
'fish'

错误:

ERROR 1054 (42S22) at line 1: Unknown column 'source' in 'where clause'

1 个答案:

答案 0 :(得分:0)

连接所需的片段,然后将该批次传递给SQL。

#!/bin/bash
sed '1s/^/select * from tablename where fieldname regexp concat(/
   $s/$/);/' /scripts/script2 |
mysql -uusername -ppassword -D dbname

(要查看sed脚本的作用,请将管道注释到MySQL。)

......或者有点等同

#!/bin/bash
mysql -uusername -ppassword -D dbname <<____HERE
  select * from tablename where fieldname regexp concat($(cat /scripts/script2));
____HERE

但如果here document包含任何shell元字符(如此处的星号),则会冒着奇怪副作用的风险。在最坏的情况下,可能会将其分为引用部分和未引用部分。

...或者,用一个稍微愚蠢的解决方法解除它:

#!/bin/bash
splat='*'
mysql -uusername -ppassword -D dbname <<____HERE
  select $splat from tablename where fieldname regexp concat($(cat /scripts/script2));
____HERE