我想在执行之前执行一个(例如sed
)命令和echo
。
我试图将命令保存在变量中
然后,echo
并执行它:
command="sed -i 's/FOO/BAR/g' myFile";
echo "Command: \"$command\"" ;
$command ;
我得到的错误:
Command: "sed -i 's/FOO/BAR/g' myFile"
sed: -e expression #1, char 1: unknown command: `''
我应该如何逃避单引号?(或者我可以使用双引号?)
我用Google搜索了,但没有找到答案。答案 0 :(得分:3)
简单的答案就是删除单引号:sed将它们解释为sed程序的一部分:
command="sed -i s/FOO/BAR/g myFile"
$command
这显然不适用于更复杂的sed脚本(例如包含空格或分号的脚本)。
正确的答案,假设您使用具有数组(bash,ksh,zsh)的shell是:
command=(sed -i 's/FOO/BAR/g' myFile)
echo "Command: \"${command[*]}\""
"${command[@]}" # the quotes are required here
请参阅http://www.gnu.org/software/bash/manual/bashref.html#Arrays
答案 1 :(得分:2)
使用$command
会绕过shell扩展,因此单引号会在参数中传递给sed
。要么松开单引号,要么使用eval $command
。
答案 2 :(得分:2)
定义一个便利函数来回显任何给定的命令,然后运行它。
verbosely_do () {
printf 'Command: %s\n' "$*"; # printf, not echo, because $@ might contain switches to echo
"$@";
}
verbosely_do sed -i 's/FOO/BAR/g' myFile
这会给你:
Command: sed -i s/FOO/BAR/g myFile
然后执行sed(1)命令。