为什么 bash post-increment 运算符设置非零结果代码?

Why does bash post-increment operator set a nonzero result code?

这让我大吃一惊:应用 post-增量运算符 (++) 到零值变量导致非零结果代码。 即,给定:

#!/bin/bash
myvar=0
let myvar++
echo "result: $?"

运行(使用 bash 5.1.0)导致:

result: 1

为什么会产生非零结果代码?我们看到相同的行为 使用数值表达式:

#!/bin/bash
myvar=0
(( myvar++ ))
echo "result: $?"

另一方面,如果我们使用 += 而不是 ++,或者如果我们从 myvar 的非零值,我们按预期收到 0 结果代码。这 正在关注...

myvar=1
let myvar+=1
echo "result: $?"

myvar=1
let myvar++
echo "result: $?"

myvar=1
(( myvar++ ))
echo "result: $?"

...所有产品:

result: 0

这是怎么回事?

来自 bash 手册页,在描述 let 的部分中:

Each arg is an arithmetic expression to be evaluated (see ARITHMETIC EVALUATION). If the last arg evaluates to 0, let returns 1; 0 is returned otherwise

建立$?值的不是运算符,而是let。由于命令let myvar++let的参数值为0,所以let returns 1.

对于 post 增量表达式,bash 计算变量并在 应用增量之前设置结果代码 。在每个 post 增量之前的值为 0 的情况下,它遵循记录的行为,

If the last arg evaluates to 0, let returns 1; 0 is returned otherwise.

注意使用预增量的区别,

myvar=0
let ++myvar
echo "result: $?"

>> result: 0

https://git.savannah.gnu.org/cgit/bash.git/tree/expr.c#n1014 中的 exp0() 中,对于 PREINC,它绑定 v2 的(字符串化)值,然后将其分配给 val,但在 POSTINC 下,它绑定变量然后丢弃 v2 而不将其分配给 val.