在bash的联机帮助页的“Compound Commands”部分下,有以下两个条目:
并在 test
和 [[
下:
我能看到的唯一区别是,其中一个括号旁边没有空格,而另一个括号里面没有空格。那到底是区分分组与子Shell的真正原因,还是取决于上下文?
换句话说,如果我运行
if ! [ 2 -eq 2 ] || ( [ 2 -eq 2 ] && [ 4 -eq 4 ] ); then echo "hello"; fi
这仅仅是对条件进行分组还是在subshell中运行?
最佳答案
这些条目的相关上下文是相关的。
后者在[[
构造的文档中,并在其参数上记录了该构造的行为。
前者正在讨论顶层Shell复合命令构造(如[[
构造本身),并介绍了一个子 shell 。
稍后在手册页中的test
/[
命令的描述中再次提到了这一点(但从本质上讲,这与[[
讨论相同)。
要在当前 shell 中进行分组,可以使用花括号:
if ! [ 2 -eq 2 ] || { [ 2 -eq 2 ] && [ 4 -eq 4 ]; }; then
...
fi
(请注意,括号和多余的分号内部的空格都是必需的。)
关于bash - bash中的括号-Subshell vs Grouping,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29261297/