Stéphane Chazelas 举了两个例子变量的值在被引用或赋值时被计算为算术表达式
$ a=1+1; echo "$((a * 3)) $(($a * 3))"
6 4
$ a=a=b++ b=1 bash -c 'echo "$((++a)) $b"'
2 2
我知道算术表达式中的变量扩展存在间接扩展。但我不明白
a
第一个例子中的和是如何$a
导致这样的差异的?我的困惑来自于算术表达式中,变量不需要参数扩展${}
,直接写变量即可。第二个例子中的算术表达式是如何计算的?
谢谢。
答案1
在算术表达式中,诸如 的文本字符串a
被解释为变量名称,并且该变量的值被处理为算术表达式本身,并且结果在包含算术表达式中使用。因此
$((a * 3))
a
导致变量, ,的值1+1
被计算为算术表达式,产生2
,并且整个表达式变为$((2 * 3))
,IE 6
。
在相同的上下文中,$a
在a
早期阶段 (这是参数展开);所以
$(($a * 3))
变为$((1+1 * 3))
,它4
遵循通常的优先规则。
在第二个示例中,$((++a))
在之前进行处理$b
(处理从左到右进行)。算术表达式导致被a
计算为算术表达式本身,如上所述;的值a
是a=b++
,在求值时,将 的值b
(本身作为算术表达式求值)赋给a
,然后递增b
。因此评估后a
,b
是2
和a
是1
。计算$((++a))
增量a
并返回其值,现在是2
。也只是$b
替换为 的值b
。处理完2
引用的参数后echo
,将作为其唯一参数echo
运行2 2
,生成您看到的输出。