我有一个这样的制表符分隔文件:
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
不幸的是,您必须对每个可能的变量名重复搜索和替换,但从积极的一面来看,这意味着您可以控制可以替换哪些变量名。