![如果出现 || 或 &&,则运行两个命令](https://linux22.com/image/885620/%E5%A6%82%E6%9E%9C%E5%87%BA%E7%8E%B0%20%7C%7C%20%E6%88%96%20%26%26%EF%BC%8C%E5%88%99%E8%BF%90%E8%A1%8C%E4%B8%A4%E4%B8%AA%E5%91%BD%E4%BB%A4.png)
答案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 元字符将它们与列表分隔开。
[重点补充]