
本文讲解如何使用 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,取决于业务语义——是「单选」还是「多选」。只要语法规范、变量防护到位,即可安全实现灵活的条件驱动执行。










