条件分支是shell脚本应对异常最直接可控的手段,需基于退出码、文件存在性、变量非空等可检测信号精准响应;善用$?、test/[ ]、case及封装错误函数统一管理。

条件分支是 Shell 脚本应对异常状态最直接、最可控的手段。关键不在于堆砌判断逻辑,而在于把“异常”提前识别为可检测的状态信号——比如命令退出码、文件是否存在、变量是否为空、数值是否越界等,再用 if 精准响应。
用 $? 捕获命令真实执行结果
Shell 中每条命令执行完都会返回一个退出码(0 表示成功,非 0 表示失败),这是判断异常最底层也最可靠的依据。
- 不要只靠“命令有没有报错文字”来判断,要主动检查
$? - 执行关键命令后立即保存退出码,避免被后续命令覆盖:
cmd; ret=$? - 常见写法:
if ! some_command; then echo "执行失败"; exit 1; fi,等价于检查$? != 0 - 数据库备份、curl 请求、scp 传输等易失败操作,必须紧跟
if判断,不能默认“应该成功”
用 test 或 [ ] 验证前置条件是否满足
很多异常其实源于脚本启动时环境就不达标,比如目录不存在、配置文件缺失、参数为空——这些都该在执行主逻辑前拦住。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
[ -f "$config_file" ] || { echo "配置文件缺失: $config_file"; exit 2; }-
[ -n "$host" ] || { echo "未指定主机名"; exit 3; }(-n判断字符串非空) -
[ -d "/data/backup" ] || mkdir -p "/data/backup"(存在则跳过,不存在则创建) - 注意:
[和]两侧必须有空格,否则语法错误
用 case 处理多值枚举型输入或状态码
当需要根据参数值、返回码范围或服务状态做不同响应时,case 比一长串 elif 更清晰、更安全。
- 例如处理 curl 返回码:
case $http_code in 200) handle_success ;; 404|500) log_error "HTTP $http_code";; *) log_warn "未知状态 $http_code";; esac - 解析命令行选项:
case "$1" in -h|--help) show_help; exit 0 ;; -v|--verbose) verbose=1 ;; *) echo "未知选项: $1"; exit 1 ;; esac - 支持通配符和管道分隔多个匹配项,逻辑集中,不易漏分支
把错误处理封装成函数统一管理
重复写 echo + exit 容易遗漏或风格不一。定义几个小函数,让错误响应变得可复用、可追溯。
-
die() { echo "❌ ERROR: $*" >&2; exit 1; }(&2输出到 stderr) warn() { echo "⚠️ WARN: $*"; }require_cmd() { command -v "$1" >/dev/null || die "缺少必要命令: $1"; }- 主流程中直接调用:
require_cmd jq; require_cmd rsync;,开头就兜底依赖










