为什么 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
.
这让我大吃一惊:应用 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
.