这让我大吃一惊:应用后增量运算符(++
(到零值变量导致非零结果代码。也就是说,给定:
#!/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
。