我想在执行之前执行一个(例如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搜索,但没有找到答案。
定义一个便捷函数来回显任何给定的命令,然后运行它。
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)命令。
简单的答案就是删除单引号: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
使用$command
绕过shell扩展,因此单引号在参数中传递给sed
。松散单引号或使用eval $command
。