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)
{...}和(...)观察以下设置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 元字符与列表分开。
[强调]