扩展从 read 命令输入的 bash 变量

扩展从 read 命令输入的 bash 变量

我有一个这样的制表符分隔文件:

table_a    "where id IN ($IDS)"
table_b    "where fk_id IN ($IDS)"
table_c    "where fk_id IN ($SOME_OTHER_IDS)"

我正在尝试编写如下脚本:

IDS="1,2,3"
SOME_OTHER_IDS="4,5,6"

while read TABLE WHERECLAUSE
do
    echo "$WHERECLAUSE"
    mysqldump ... --where="$WHERECLAUSE"
done < 'myfile.txt'

$IDS问题是,当从命令中读取它时,它当然不会被扩展/解释read

看来我可以在循环中做一些事情,例如:

WHERECLAUSE=`eval echo "$WHERECLAUSE"`

但是这样使用 eval 是否本质上不安全?

有没有更好的替代方法$IDS可以避免eval以不安全的方式使用?最好我正在寻找一种同时支持 OSX 和 Ubuntu 的解决方案。

谢谢!

答案1

eval绝对应该是你的最后选择,特别是当输入文件是用户输入时。

对于简单的情况(即您不需要担心转义字符和引号),您可以执行以下操作:

IDS="1,2,3"
SOME_OTHER_IDS="4,5,6"

while read TABLE WHERECLAUSE
do
    WHERECLAUSE=${WHERECLAUSE//\$IDS/$IDS}
    WHERECLAUSE=${WHERECLAUSE//\$SOME_OTHER_IDS/$SOME_OTHER_IDS}
    echo "$WHERECLAUSE"
    mysqldump ... --where="$WHERECLAUSE"   
done

不幸的是,您必须对每个可能的变量名重复搜索和替换,但从积极的一面来看,这意味着您可以控制可以替换哪些变量名。

相关内容