如果 [ 是内置函数并且 [[ 是关键字,那么 ((?

如果 [ 是内置函数并且 [[ 是关键字,那么 ((?

根据这个帖子,[是内置函数并且[[是关键字。由于它们可以被视为命令,因此[和之后的所有内容[[都被视为命令参数,并且应该用空格分隔,直到它们满足最终参数]]]

但 的类型是什么((

type ((

会报错:

 bash: syntax error near unexpected token `('. 

我发现空格在里面不相关(( ))

echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+  1))
echo $(( 1  +  1  ))

都一样


概括

根据POSIX 标准文档:分组命令部分

如果以“((”开头的字符序列将被 shell 解析为算术扩展(如果前面有“$”),则实现扩展的 shell 可以将“((表达式))”计算为算术表达式。 “((”作为算术求值而不是分组命令引入。符合要求的应用程序应确保用空格分隔两个前导 '(' 字符,以防止 shell 执行算术求值。

并且内部的算术求值((...))符合C风格。所以空间与内部无关((...))

答案1

((不是一个词。与[and不同[[,它不是构成命令的单词列表的一部分。最好的方式是将其视为标点符号。实际上,它是两个标点符号,根据上下文,它们可能会也可能不会组合在一个标记中。在这方面,它类似于>&和之类的东西。 ||shell 的词法分析器/解析器以特殊方式处理标点符号。

((是运算符的一半,另一半是))。它们一起构成了算术表达式运算符,它具有“outfix”语法。 bash 等 shell 语言的语法结构并没有非常整齐地遵循传统编程语言的语法(例如,词法分析和语法分析之间存在非常紧密的联系,因为标点符号的含义取决于语法上下文),因此并不总是很合适的词。

type只能为您提供有关可以出现在简单命令中的单词和关键字的信息,而不是有关 shell 的词法分析器/解析器如何工作的信息。

相关内容