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

问题描述 投票:2回答:3

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

shell unix sed
3个回答
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)命令。


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


2
投票

使用$command绕过shell扩展,因此单引号在参数中传递给sed。松散单引号或使用eval $command

© www.soinside.com 2019 - 2024. All rights reserved.