$( (( 表达式 )) ) 和 $((( 表达式 ))) 有什么区别?

$( (( 表达式 )) ) 和 $((( 表达式 ))) 有什么区别?

为什么他们有不同的输出?

echo $( (( 5+5 )) )

echo $((( 5+5 )))
10

答案1

bash在启用的情况下运行命令set -x

$ set -x
$ echo $( (( 5+5 )) )
++ ((  5+5  ))
+ echo

$ echo $((( 5+5 )))
+ echo 10
10
$ echo $(( ( 5+5 ) ))
+ echo 10
10

如您所见,$(...)第一个命令中的 被视为命令替换。此命令替换运行命令((5+5))。这又是一个没有任何输出的算术评估,因此echo不会获取任何参数,仅输出换行符。

在另一种情况下(以及我添加的额外情况),$((...))被视为算术展开式。这会计算 的值(5+5)并被该计算的结果替换。

为了避免混淆,我建议您使用空格来帮助bash解析器查看您想要使用的语法分组类型,就像我在上面最后一个命令中所示的那样。

答案2

$( (( 5+5 )) )5+5是内部的算术表达式算术复合命令 (( … ))里面一个命令替换 $( … )。算术复合命令不产生任何输出,因此命令替换的结果为空。算术复合命令仅对赋值有用(该命令没有任何赋值)或其返回值(此处未使用)。

$((( 5 + 5 )))或者是内部的$(( ( 5+5 ) ))算术表达式( 5 + 5 )算术展开 $(( … ))。算术展开的结果是数值(以十进制格式表示)。

相关内容