命令执行失败时应立即捕获非零退出码,而非忽略:用 $? 紧随关键命令检查、用 if 显式分支、用 ||/&& 短路逻辑、脚本末尾显式 exit 返回明确状态码。

遇到命令执行失败返回非零退出状态码时,关键不是忽略它,而是立刻捕获并响应——因为 shell 不会自动中断后续操作,错误可能被掩盖,甚至引发严重后果(比如误删文件)。
用 $? 立刻检查上一条命令的状态
每次关键命令运行后,必须紧跟着读取 $? 变量。它的值只保留最近一次命令的退出码,稍晚一步就失效了。
- 正确写法:命令执行完马上判断,中间不能插入其他命令
- 常见错误:先 echo 或 log 再查 $?,这时 $? 已变成 echo 的返回值(通常是 0)
- 示例:cd /data && ls -l 看似简洁,但 cd 失败时 ls 仍会执行(在当前目录),容易出错;应拆开检查
用 if 结构做显式分支处理
把命令放在 if 条件中,让 shell 自动根据其退出码决定走哪条路径,比手动查 $? 更安全、更直观。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- if 命令本身成功(退出码为 0)才执行 then 分支;失败则走 else
- 等价于:if [ $? -eq 0 ]; 但更简洁、不易出错
- 示例:if rm -f important.log; then echo "已清理"; else echo "删除失败,跳过"; exit 1; fi
用 || 和 && 实现简单短路逻辑
适合单步补救或快速失败场景,语义清晰,一行搞定。
- command1 || command2:command1 失败(非 0)才执行 command2
- command1 && command2:command1 成功(0)才执行 command2
- 常用组合:cd /target || { echo "目录不存在"; exit 2; }
- 注意:不要链式堆叠过长,可读性会下降,复杂逻辑仍推荐 if
给脚本设置明确的 exit 码并对外暴露结果
脚本结束前主动调用 exit N,让调用者能可靠判断成败——这是专业脚本的基本修养。
- 约定:0 表示全部成功;1~127 通常表示通用错误;128+ 一般留给信号中断(如 130 是 Ctrl+C)
- 避免只靠最后一条命令隐式退出:万一最后是 echo 或 printf,总返回 0,掩盖前面的失败
- 示例结尾:if all_ok; then exit 0; else exit 3; fi










