Linux中判断命令是否执行成功依据退出状态码:成功为0,失败为1–255;通过$?获取,推荐在if中直接判断命令本身,或用&&/||串联,必要时保存$?到变量。

Linux中判断命令是否执行成功,核心依据是它的退出状态码(exit status),而不是输出内容。成功为 0,失败为 非0值(1–255)。所有命令执行完都会返回这个值,Shell 通过特殊变量 $? 获取它。
用 $? 显式检查上一条命令结果
执行命令后立即读取 $?,是最直接的方式:
-
ls /tmp/exist_dir; echo $?→ 输出0表示存在且列出成功 -
ls /tmp/missing; echo $?→ 输出2(常见错误码)表示失败 - 在 if 语句中使用:
cp file1.txt /backup/<br>if [ $? -eq 0 ]; then<br> echo "备份完成"<br>else<br> echo "备份失败"<br>fi
用 && 和 || 简洁串联逻辑
无需显式写 $?,适合简单场景:
-
mkdir /data && touch /data/log.txt:只有mkdir成功,才执行touch -
ping -c1 google.com &>/dev/null || echo "网络不通":ping 失败时才提示 - 组合使用:
cd /app || mkdir /app && cd /app:先尝试进入,失败就建目录再进
在脚本中用 if 判断命令本身(推荐写法)
把命令直接放在 if 后面,Shell 自动取其退出状态,更简洁安全:
if cp source.txt dest.txt; then<br> echo "复制成功"<br>else<br> echo "复制失败"<br>fi
- 注意:不要写成
if [ $(cp ...) ]或if [ $? -eq 0 ]在同一行后立刻用 —— 因为[是个命令,会覆盖上一个命令的$? - 如果需多次使用该状态,应先存到变量:
cp a b; ret=$?; if [ $ret -eq 0 ]; then ...
自定义命令退出码辅助调试
脚本结尾可用 exit N 设置整体退出状态,方便上游调用者判断:
- 脚本中检测关键步骤:
grep "ERROR" app.log &>/dev/null && exit 1 || exit 0 - 外部调用时可直接用:
./check.sh && echo "健康" || echo "异常" - 避免不写
exit导致脚本以最后一条命令状态退出,可能掩盖真实问题


















