首页 > 解决方案 > || 中的 {} 和 () shell脚本中的语句

问题描述

我正在编写一个在某些情况下应该退出的 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失败,会在“||”之后去代码,回显错误,然后退出子shell并返回false。所以整行是“false||false”所以它退出了,因为我在开头有“set -e”。但是后来我读了如果命令失败如何退出? 它提到“set -e”是危险的,因为它不会在 if 语句中被触发,所以这是否意味着如果我的“运行 D”命令失败,它将无法工作?(意味着它不会退出并将继续执行下一个命令)。另外,我尝试按照上述帖子的建议使用 {},但这很奇怪。如果我将其更改为:

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

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

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

无论 A 成功或失败,它总是在这里退出。

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

标签: sh

解决方案


Using( )会产生一个子 shell,而 using{ }不会,后者允许封闭exit直接终止您的脚本。

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

鉴于上述限制,请尝试更改:

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

... 至:

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

推荐阅读