如果出现 || 或 &&,则运行两个命令

如果出现 || 或 &&,则运行两个命令

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

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

我想做类似的事情

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

仅当没有互联网连接时才会退出。

答案1

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

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

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

为什么需要分号或换行符

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

$ echo }
}

因此,如果 shell 看到:

{ command1; command2 }

shell 将 command1 解释为没有参数,将 command2 解释为有一个由字符 组成的参数}。只有当花括号}位于分号或换行符之后时,它才会被解释为结束分组。要使上述操作有效:

{ command1; command2; }

{...}子壳层以及和之间的区别(...)

注意,以下内容设置为 10,但是在命令运行x之前该设置被忘记了: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

区别在于子 shell 中的变量赋值在子 shell 完成后不再存在。

文档

man bash

(列表)

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

{ 列表; }

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

[重点补充]

相关内容