如何在 bash 中运行带有大括号的以下命令?

如何在 bash 中运行带有大括号的以下命令?

我的 bash 脚本有以下内容

CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new" 
echo "Running $CMD"                                                                                     
`$CMD`                                                                                                  

当我调用脚本时

Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found 

但是当我{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new在命令行上运行时它工作正常。

我尝试逃避但{没有成功,我该怎么办?

答案1

好吧,如果您在命令行上使用这样的变量,它将被拆分为单词,但这种情况发生在解析{(或) 等语法项之后。if所以,如果你想要这样,你就必须使用eval

CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"

尽管 noteeval将运行当前 shell 中变量中的所有内容,包括对变量的赋值(IFS例如,更改可能会对脚本的其余部分产生有趣的影响)。您可以在单独的 shell 中运行它,以bash -c "$CMD"至少缓解变量分配问题。

另请注意,反引号用于捕获命令的输出,并在命令行上使用它,因此这会将$CMDalso的输出作为命令运行:

$ CMD="echo foo"
$ `$CMD`
-bash: foo: command not found

如果您将输出重定向到文件,这并不重要,但您很可能也不需要它。

答案2

尝试

function exec_cmd() {
    printf "+ %s \n\n" "$1"
    bash -c "$1" || exit 1
}

exec_cmd '{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new' 

那么你就不必担心逃脱字符串。
请注意bash -c <command>用法,后面的下一个参数<command>用作$0(脚本内部的脚本“名称”),后续参数成为位置参数($1、$2 等)。

相关内容