如何在 Bash 脚本中根据包启用状态(ON/OFF)选择性执行对应代码块

本文讲解如何使用 bash 的 if/elif/fi 和独立 if 语句,精准控制多选项(如 package1、package2)下的代码执行逻辑,避免误跳转或重复执行,并提供可直接复用的健壮写法。

在 Bash 脚本中,根据变量值(如 package1="ON" 或 package2="OFF")动态执行不同逻辑,是运维和自动化部署中的常见需求。关键在于正确理解条件分支的执行逻辑:if-elif-else 是互斥选择(仅匹配第一个为 true 的分支),而多个独立的 if 语句则是并行判断(每个条件单独评估,可能多次触发)。

✅ 正确语法要点:

  • 使用 [ "$var" = "ON" ](注意等号两侧空格,双引号防止变量为空时报错);
  • elif 必须紧跟 then 块的 fi 之前,不能单独成块;
  • 不支持 elseif(这是常见错误;Bash 中只有 elif,无 e 后缀);
  • 条件判断后必须用 fi 显式结束每个 if 块。

? 场景一:互斥执行(仅运行首个启用的包)
适用于“二选一”策略,例如同一环境只允许启用一个功能包:

if [ "$package1" = "ON" ]; then
    echo "Executing package1 workflow..."
    # 替换为你实际的逻辑:如解压、配置、权限设置等
    chown "$username." "/home/$username/domains/$domain/public_html/.htaccess"
elif [ "$package2" = "ON" ]; then
    echo "Executing package2 workflow..."
    # package2 专属操作(路径、命令、参数均可不同)
    chown "$username." "/home/$username/domains/$domain/public_html/.user.ini"
fi

? 场景二:独立执行(多个包可同时启用并分别运行)
适用于模块化设计,各包职责正交、可叠加:

if [ "$package1" = "ON" ]; then
    echo "Applying package1 settings..."
    chown "$username." "/home/$username/domains/$domain/public_html/.htaccess"
fi

if [ "$package2" = "ON" ]; then
    echo "Applying package2 settings..."
    chown "$username." "/home/$username/domains/$domain/public_html/.user.ini"
fi

⚠️ 注意事项:

  • 始终对变量加双引号("$package1"),避免空值或含空格字符串导致语法错误;
  • 不要混用 [[ ]] 和 [ ] 风格的条件测试——本文推荐 POSIX 兼容的 [ ](即 test 命令),更稳定;
  • 若需支持大小写不敏感判断,可用 shopt -s nocasematch + [[ $package1 == [oO][nN] ]],但生产环境建议统一约定大写 ON/OFF;
  • 可添加兜底逻辑:在所有 if 后追加 else 或独立检查 if [ "$package1" = "OFF" ] && [ "$package2" = "OFF" ]; then echo "No package enabled."; exit 0; fi,提升脚本健壮性。

总结:选择 if-elif 还是多个 if,取决于业务语义——是「单选」还是「多选」。只要语法规范、变量防护到位,即可安全实现灵活的条件驱动执行。