我是一个 bash 脚本,我有以下内容
CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new"
echo "Running $CMD"
`$CMD`
Run Code Online (Sandbox Code Playgroud)
当我调用脚本时
Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found
Run Code Online (Sandbox Code Playgroud)
但是当我{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
在命令行上运行时,它工作正常。
我试图逃避{
没有成功,我该怎么做?
好吧,如果您像这样在命令行上使用变量,它将被拆分为单词,但是在解析{
(或if
)等语法项之后会发生这种情况。所以,如果你想要那个,你将不得不使用eval
CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"
Run Code Online (Sandbox Code Playgroud)
尽管 noteeval
将在当前 shell 中运行变量中的所有内容,包括对变量的赋值(例如,更改IFS
可能会对脚本的其余部分产生有趣的影响)。您可以在单独的 shell 中运行它,bash -c "$CMD"
以至少减轻变量分配问题。
另请注意,反引号用于捕获命令的输出,并在命令行上使用它,因此这也将$CMD
作为命令运行输出:
$ CMD="echo foo"
$ `$CMD`
-bash: foo: command not found
Run Code Online (Sandbox Code Playgroud)
如果您将输出重定向到一个文件,这并不重要,但您很可能也不需要它。