了解在算术表达式中使用间接扩展进行变量扩展的两个示例

了解在算术表达式中使用间接扩展进行变量扩展的两个示例

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

在相同的上下文中,$aa早期阶段 (是参数展开);所以

$(($a * 3))

变为$((1+1 * 3)),它4遵循通常的优先规则。

在第二个示例中,$((++a))在之前进行处理$b(处理从左到右进行)。算术表达式导致被a计算为算术表达式本身,如上所述;的值aa=b++,在求值时,将 的值b(本身作为算术表达式求值)赋给a,然后递增b。因此评估后ab2a1。计算$((++a))增量a并返回其值,现在是2。也只是$b替换为 的值b。处理完2引用的参数后echo,将作为其唯一参数echo运行2 2,生成您看到的输出。

相关内容