在bash的联机帮助页的“Compound Commands”部分下,有以下两个条目:



并在 test [[ 下:



我能看到的唯一区别是,其中一个括号旁边没有空格,而另一个括号里面没有空格。那到底是区分分组与子Shell的真正原因,还是取决于上下文?

换句话说,如果我运行

if ! [ 2 -eq 2 ] || ( [ 2 -eq 2 ] && [ 4 -eq 4 ] ); then echo "hello"; fi

这仅仅是对条件进行分组还是在subshel​​l中运行?

最佳答案

这些条目的相关上下文是相关的。

后者在[[构造的文档中,并在其参数上记录了该构造的行为。

前者正在讨论顶层Shell复合命令构造(如[[构造本身),并介绍了一个子 shell 。

稍后在手册页中的test/[命令的描述中再次提到了这一点(但从本质上讲,这与[[讨论相同)。

要在当前 shell 中进行分组,可以使用花括号:

if ! [ 2 -eq 2 ] || { [ 2 -eq 2 ] && [ 4 -eq 4 ]; }; then
    ...
fi

(请注意,括号和多余的分号内部的空格都是必需的。)

关于bash - bash中的括号-Subshel​​l vs Grouping,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29261297/

10-16 11:08