为什么bash后增量运算符设置非零结果代码



这让我大吃一惊:应用后增量运算符(++(到零值变量导致非零结果代码。也就是说,给定:

#!/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:的部分

每个arg都是要求值的算术表达式(请参见arithmetic EVALUATION(。如果最后一个arg的计算结果为0,则let返回1;返回0,否则

建立$?值的不是运算符,而是let。由于命令let myvar++let的参数值为0,因此let返回1。

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

如果最后一个arg的求值结果为0,则let返回1;否则返回0。

请注意,如果您使用预增量,

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

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

最新更新