编辑: 我又试了一次,现在可以正常工作了bash
。我不知道发生了什么变化。我的编辑器(带有 Bash IDE 扩展的 VS Code)仍然给我一个failed to parse
错误,但脚本运行正常。我应该删除这个问题吗?
原问题
我的脚本目前执行此操作:
if cmd1; then
echo Success
else
if [[ "$x" == "z" ]] && cmd2; then
echo Success
else
echo Failure
fi
fi
我一直试图将其缩短为“一行字”,但bash
对这样的声明感到哽咽:
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
echo Success
else
echo Failure
fi
我认为这{ grouping }
是必要的,因为否则&& cmd
总会被执行。我怎样才能解决这个问题?
答案1
您可以使用子 shell 将其分组:
if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
...
else
...
fi
答案2
它工作正常:
cmd1() { return 1; }
cmd2() { return 0; }
x=z
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
echo Success
else
echo Failure
fi
Success
您确定您没有在 中运行此代码吗sh
?那会给你类似的东西
sh: 4: [[: not found
答案3
问题中的代码应该在实际的 shell 中正常工作,但我可以理解其他一些程序可能无法解析它。假设我们无法修复该程序,解决方法可能是将条件的第二部分拆分为一个函数:
cond2() { [[ "$x" = "z" ]] && cmd2; }
if cmd1 || cond2; then
...
这不是那么简短,但如果解析器值得任何事物,它应该能够解析该函数定义。