在使用&&和||时如何执行退出命令?

时间:2018-10-10 05:35:16

标签: linux bash shell scripting

我有两种情况。

  1. echo a &>/dev/null && echo b || (echo c ; exit 1) ; echo d ;echo e;echo f

输出:

  

b

     

d

     

e

     

f

  1. echo a &>/dev/null && echo b || (echo c ; exit 1) ; echo d ;echo e;echo f

输出:

  

c

     

d

     

e

     

f

我需要我的脚本在退出命令后退出,并且不执行其他命令。我该怎么办?

2 个答案:

答案 0 :(得分:1)

( )中的命令在子shell中执行,因此parens中的exit仅退出子shell,而不退出主shell。您可以使用{ }而不是parens对命令进行分组,而不强制使用子外壳。注意:与括号不同,{后需要一个空格,}前需要一个分号(或“&”号)。

$ eco a &>/dev/null && echo b || { echo c ; exit 1; } ; echo d ;echo e;echo f output
c
logout

另外,您应注意,使用&& ... ||if then else fi结构不相同;特别是,如果&&||之间的命令(与then语句中的if子句之间的命令)碰巧失败,它将在执行之后执行||也是如此。仅存在echo b,它不太可能(但从技术上来说)会失败;如果比较复杂,您会得到意想不到的结果。

因此,我建议使用if then else fi而不是&& || -它可以正确处理分组,而不会带来额外的麻烦,并且没有明显的执行路径。与&& ||不同,它可以正常工作。

答案 1 :(得分:0)

exit最终将退出子Shell((...)),而不是脚本调用它。

请参见Command grouping

但是,echo b以状态0退出,因此||之后的任何内容都不会执行。