为什么bash后自增运算符对初始为0的变量操作返回非零结果码?
原因说明
这个现象是Bash算术运算的两条规则共同作用的结果:
let命令和((...))算术表达式的退出码遵循固定逻辑:如果表达式的最终计算结果为0,退出码返回1;如果计算结果非0,退出码返回0。这个设计的目的是让算术表达式可以直接用于if、while等条件判断场景,不需要额外做布尔值转换。- 后自增运算符
变量++的返回值是变量自增前的旧值,运算结束后才会更新变量本身的存储值。
不同测试场景的对应解释
初始值为0的后自增场景:
myvar=0 let myvar++这里
myvar++的返回值是自增前的旧值0,符合退出码规则里的「表达式结果为0」的条件,因此$?输出为1,(( myvar++ ))的逻辑完全一致。初始值为非0的后自增场景:
myvar=1 let myvar++这里
myvar++的返回值是自增前的旧值1,属于非0结果,因此退出码返回0。使用
+=运算符的场景:myvar=0 let myvar+=1+=运算符的返回值是运算完成后的新值,这里计算后的结果为1,非0,因此退出码返回0。如果把代码改为let myvar+=0,表达式结果为0,退出码又会变成1。
补充说明
如果你只需要更新变量值,不需要判断算术表达式的结果,可以忽略这个退出码;如果需要强制让语句返回0,可以写成let myvar++ || true的形式。
内容的提问来源于stack exchange,提问作者larsks
相关产品推荐
相关产品推荐

