Unix:在变量中保存sed命令,以回显它,然后执行它

时间:2013-04-18 15:08:02

标签: shell unix sed

我想在执行之前执行一个(例如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搜索了,但没有找到答案。

3 个答案:

答案 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)命令。