在||的情况下运行两个命令 要么 &&


11

我已经读过&&和|| 我想在错误的情况下运行两个命令。

我已经尝试过了,;但是一直都运行。我尝试将其放在花括号中,{ command1; command2 }但这会导致语法错误。

我想做类似的事情

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

仅在没有互联网连接时退出。


1
这似乎是一个简单的印刷错误。一种方法更有趣的问题是之间的差异(){}
edwinksl

Answers:


27

使用parens会将命令放在并非总是您想要的子外壳中。或者,使用花括号:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

这里的窍门是,与括号不同,括号中的最终命令必须后跟;

为什么需要分号或换行符

大括号是命令的有效参数。例如,这里有一个花括号作为参数echo

$ echo }
}

因此,如果外壳看到:

{ command1; command2 }

Shell将command1解释为没有参数,而将command2解释为只有一个由字符组成的参数}。花括号}仅在分号或换行符之后才被解释为结束分组。要进行上述工作:

{ command1; command2; }

子shell之间的差异{...}(...)

观察到以下设置x为10,但是在echo命令运行之前忘记了该设置:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

相比之下,使用花括号x=10可以记住的设置:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

区别在于,子外壳程序完成后,子外壳程序中的变量分配无法继续存在。

文献资料

来自man bash

(清单)

list是在子shell环境中执行的(请参阅下面的COMMAND EXECUTION ENVIRONMENT)。在命令完成后,影响外壳环境的变量分配和内置命令将保持无效。返回状态是列表的退出状态。

{清单; }

list仅在当前的shell环境中执行。 列表必须以换行符或分号终止。 这称为组命令。返回状态是列表的退出状态。请注意,与元字符(和)不同,{和}是保留字,并且必须出现在允许识别保留字的位置。由于它们不会造成单词中断,因此必须使用空格或其他Shell元字符将它们与list分开。

[强调已添加]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.