混合如果...;与 { 命令分组} 和 [[ test ]] 以及逻辑运算符

混合如果...;与 { 命令分组} 和 [[ test ]] 以及逻辑运算符

编辑: 我又试了一次,现在可以正常工作了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
     ...

这不是那么简短,但如果解析器值得任何事物,它应该能够解析该函数​​定义。

相关内容