在 || 的情况下运行两个命令 或者 &&

Tho*_*ler 16 command-line bash

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

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

我想做类似的事情

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1
Run Code Online (Sandbox Code Playgroud)

只有在没有互联网连接时才会退出。

Joh*_*024 33

使用括号将命令放在子shell 中,这并不总是您想要的。或者,使用花括号:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
Run Code Online (Sandbox Code Playgroud)

这里的技巧是,与括号不同,大括号中的最后一个命令必须跟在;.

为什么需要分号或换行符

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

$ echo }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果 shell 看到:

{ command1; command2 }
Run Code Online (Sandbox Code Playgroud)

shell 将 command1 解释为没有参数,将 command2 解释为有一个由字符 组成的参数}。如果花括号}跟在分号或换行符之后,它只会被解释为关闭分组。为了使上述工作:

{ command1; command2; }
Run Code Online (Sandbox Code Playgroud)

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

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

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
Run Code Online (Sandbox Code Playgroud)

相比之下,花括号的设置x=10被记住:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10
Run Code Online (Sandbox Code Playgroud)

不同之处在于子shell 中的变量赋值在子shell 完成后不再存在。

文档

来自man bash

(列表)

list 在子 shell 环境中执行(请参阅下面的命令执行环境)。影响 shell 环境的变量赋值和内置命令在命令完成后不再有效。返回状态是列表的退出状态。

{ 列表; }

list 只是在当前 shell 环境中执行。 列表必须以换行符或分号结束。 这称为组命令。返回状态是列表的退出状态。请注意,与元字符 ( and ) 不同,{ 和 } 是保留字,必须出现在允许识别保留字的地方。由于它们不会导致断字,因此它们必须通过空格或其他 shell 元字符与列表分开。

[强调]