linux中判断上条命令是否正常结束,需检查特殊变量 $? 的值:0 表示成功,非0表示失败;可用 echo $? 查看,或在 if 语句中自动依据退出状态分支,脚本中需立即保存 $? 防止被覆盖。

在 Linux 中,判断上一条命令是否正常结束,核心是检查它的退出状态(exit status),而这个值就保存在特殊变量 $? 里。只要上条命令执行完毕,$? 就立刻更新为它的退出码:0 表示成功,非 0(如 1、2、127 等)表示失败或异常。
直接查看退出码
最简单的方式是在命令执行后立即运行:
-
echo $?—— 输出上一条命令的退出码 - 若显示 0,说明它成功结束;显示其他数字,说明执行出错或被中断
在 if 语句中自动判断
无需显式读取 $?,shell 的 if 语句本身就基于上一条命令的退出状态做分支:
if command; then echo "成功"; else echo "失败"; fi- 这里的
command执行完,shell 自动用它的退出码决定走then还是else - 等价于写成
command; if [ $? -eq 0 ]; then ...,但更简洁、更安全(避免中间插入其他命令污染$?)
在脚本中可靠捕获状态
如果需要把退出码存起来后续多次使用(比如日志、嵌套判断),必须在下一条命令前立即保存:
ls /tmp/somefile >/dev/null; result=$?if [ $result -eq 0 ]; then ...- 不推荐反复用
$?多次,因为任何新命令(包括echo、[测试)都会覆盖它
注意几个常见误区
有些情况看似“没报错”,实则已失败:
- 命令不存在 → 退出码通常是 127
- 权限不足(如无执行权)→ 退出码通常是 126
- 管道中某个命令失败,但整条管道仍可能返回 0(取决于
pipefail设置) - 后台命令(
&)不能直接用$?获取其状态,需用wait配合











