You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 18:42:13