Bash中为何初始值为0时自增运算符会将退出码设为1?
Bash中((cnt++))退出码差异的原因
先看你提供的Bash会话示例:
$ cnt=0 $ echo $? 0 $ ((cnt++)) $ echo $? 1 $ echo $cnt 1 $ ((cnt++)) $ echo $? 0 $ echo $cnt 2
核心原因是Bash里((...))的退出规则和cnt++的运算特性共同作用的结果:
((...))是Bash的算术扩展结构,它的退出码规则直接和表达式计算结果挂钩:如果表达式最终值是0,退出码设为1;如果是非0值,退出码设为0。cnt++属于后置自增运算符,运算逻辑是先返回变量当前的原始值,再把变量自身加1。
对应到你的例子:
- 初始
cnt=0时,执行((cnt++)),表达式返回的是cnt的原始值0,符合“结果为0”的情况,所以退出码是1,执行完后cnt才被更新为1。 - 当
cnt=1时,再执行((cnt++)),表达式返回的是cnt的原始值1(非0),所以退出码是0,执行完后cnt被更新为2。
内容的提问来源于stack exchange,提问作者Damo
相关产品推荐
相关产品推荐

