我正在编写一个脚本,它从MySQL获取命令并逐个执行。我的问题是我无法执行脚本中的命令:
./ bash.sh:line 26:/myscript.sh -c“”:没有这样的文件或目录
第26行是我想要执行的命令(“$ com”)。如果我尝试手动运行命令,通过回显“$ com”的内容而不是从终端运行它,它正在工作。
我做错了什么?
if [ ! "${#array[*]}" -eq "0" ]; then
for (( i=0 ; i<cnt ; i++ )); do
id=$(echo "${array[$i]}" | sed 's@\t@^@g' | cut -f'1' -d'^')
com=$(echo "${array[$i]}" | sed 's@\t@^@g' | cut -f'2' -d'^')
imp=$(echo "${array[$i]}" | sed 's@\t@^@g' | cut -f'3' -d'^')
if [[ "$id" = [0-9]* ]]; then
"$com"
echo "DELETE FROM list WHERE id='$id'" | mysql "$DB_USER" -u "$DB_USER" -p"$DB_PASS"
fi
done
else
echo "The list is empty"
fi
答案 0 :(得分:4)
添加为社区Wiki
这个问题在 Vaughn Cato 的评论中得到了解决,OP自3月以来就没有出现过。
接受答案是使用eval
所以脚本中的if语句是:
if [[ "$id" = [0-9]* ]]; then
eval "$com"
echo "DELETE FROM list WHERE id='$id'" | mysql "$DB_USER" -u "$DB_USER" -p"$DB_PASS"
fi
答案 1 :(得分:1)
更改
"$com"
而不是
$com
(记住:太多的报价可能和太少的报价一样有害)
而不是
eval "$com"
eval
只是为了撤消不必要的引用效果,这是不必要的复杂。