我的 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"
至少缓解变量分配问题。
另请注意,反引号用于捕获命令的输出,并在命令行上使用它,因此这会将$CMD
also的输出作为命令运行:
$ 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 等)。