sh中continue为何不保留命令的退出状态?
在sh环境中continue语句为何无法保留命令的退出状态?
这本质是因为continue作为shell内置命令,它自身的退出状态永远是0,而shell会把循环体中最后执行的完整语句的退出状态作为后续*$?*的值。
示例拆解分析
第一个示例
代码:
#!/bin/sh for i in 0; do false || continue done echo $?
输出:0
执行逻辑是:false运行后返回退出状态1,触发||后的continue。此时循环体里最后执行的命令是continue,它的退出状态是0。循环结束后,*$?*就保留了这个0值,所以最终输出0。
第二个示例
代码:
#!/bin/sh for i in 0; do false done echo $?
输出:1
这个例子里,循环体只执行了false,它的退出状态是1。循环结束后*$?*自然保留了这个失败状态,所以输出1。
关键逻辑总结
- sh里所有命令(包括内置命令)都有自己的退出状态,continue的固定退出状态是0。
- 当用
命令A || continue这种组合时,整个语句的退出状态由最后实际执行的命令决定:命令A失败就执行continue,此时语句状态为0;命令A成功则continue不执行,语句状态为命令A的0。 - 循环结束后,*$?*记录的是循环体最后一条完整语句的退出状态,而非之前失败命令的状态。
如果需要保留失败命令的状态,可以手动将其存入变量:
#!/bin/sh last_status=0 for i in 0; do false last_status=$? [ $last_status -ne 0 ] && continue done echo $last_status
这样就能输出false的退出状态1了。
内容的提问来源于stack exchange,提问作者Rihad
相关产品推荐
相关产品推荐

