2

我想在执行之前执行一个(例如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: `''

我应该如何转义单引号?(或者我可以使用双引号吗?)

我用谷歌搜索了它,但没有找到答案。

4

3 回答 3

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

于 2013-04-18T15:39:16.983 回答
2

的使用$command绕过了外壳扩展,因此单引号在参数中传递给sed. 要么松开单引号,要么使用eval $command.

于 2013-04-18T15:39:37.003 回答
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) 命令。

于 2013-04-18T15:50:23.683 回答