根据这个帖子,[
是内置函数并且[[
是关键字。由于它们可以被视为命令,因此[
和之后的所有内容[[
都被视为命令参数,并且应该用空格分隔,直到它们满足最终参数]
和]]
但 的类型是什么((
?
type ((
会报错:
bash: syntax error near unexpected token `('.
我发现空格在里面不相关(( ))
。
echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+ 1))
echo $(( 1 + 1 ))
都一样
概括
如果以“((”开头的字符序列将被 shell 解析为算术扩展(如果前面有“$”),则实现扩展的 shell 可以将“((表达式))”计算为算术表达式。 “((”作为算术求值而不是分组命令引入。符合要求的应用程序应确保用空格分隔两个前导 '(' 字符,以防止 shell 执行算术求值。
并且内部的算术求值((...))
符合C风格。所以空间与内部无关((...))
答案1
((
不是一个词。与[
and不同[[
,它不是构成命令的单词列表的一部分。最好的方式是将其视为标点符号。实际上,它是两个标点符号,根据上下文,它们可能会也可能不会组合在一个标记中。在这方面,它类似于>&
和之类的东西。 ||
shell 的词法分析器/解析器以特殊方式处理标点符号。
((
是运算符的一半,另一半是))
。它们一起构成了算术表达式运算符,它具有“outfix”语法。 bash 等 shell 语言的语法结构并没有非常整齐地遵循传统编程语言的语法(例如,词法分析和语法分析之间存在非常紧密的联系,因为标点符号的含义取决于语法上下文),因此并不总是很合适的词。
type
只能为您提供有关可以出现在简单命令中的单词和关键字的信息,而不是有关 shell 的词法分析器/解析器如何工作的信息。