{} 和 () 在 || shell 脚本中的语句

{} and () in || statement in shell script

我正在编写一个 shell 脚本,在某些情况下应该会退出,我当前的代码是:

 set -e 

    Running A || (echo "failed to run A"; exit 1)
    Running B || (echo "failed to run B"; exit 1)
    if Condition C
    then 
       Running D || (echo "failed to run D"; exit 1)
    ....

并且按预期工作,如果 A/B 运行良好,它会通过,如果 A 或 B 失败,则为我回显消息,但我还没有测试 D 失败。我的理解是如果A或者B失败了,会去"||"之后的代码,回显错误,然后退出subshell and return false。所以整行是 "false||false" 所以它退出了,因为我在开头有 "set -e" 。但后来我读了 How to exit if a command failed? 它提到 "set -e" 是危险的,因为它不会在 if 语句中触发,所以这是否意味着如果我的 "Running D" 命令失败它就不会工作?(意味着它不会退出并将继续执行下一个命令)。 另外,我尝试按照上面 post 的建议使用 {},但这很奇怪。如果我将其更改为:

#set -e
Running A || {exit 1}

正确,意思是如果A成功,继续下一个命令,如果A失败,退出脚本。但是如果我改成

#set -e
Running A || {echo "running A failed";exit 1}

无论A成功与否,总是从这里退出

怎么了?另外,我现在有点困惑,在我的情况下,哪种退出方式最好?我应该使用 "set -e" 还是“{}”?谢谢!

使用 ( ) 会生成子 shell,而使用 { } 则不会,后者允许包含 exit 直接终止您的脚本。

组命令语法使用{ }语法有点挑剔。您必须使用空格将大括号字符与其他字符分开。您还需要在组中的最后一个命令之后使用尾随分号。

考虑到上述限制,尝试更改:

Running A || {echo "running A failed";exit 1}

...至:

Running A || { echo "running A failed";exit 1; }