如何在 Bash 脚本中根据开关状态选择性执行对应代码块

本文详解如何使用 `if-elif-fi` 和独立 `if` 结构,在 bash 中实现“仅启用的包执行对应逻辑”,支持单选互斥或多重启用两种场景,并附正确语法、常见错误规避及实用示例。

在 Bash 脚本中,根据变量值(如 package1 或 package2 是否为 "ON")动态执行不同代码路径,是运维自动化和配置管理中的常见需求。关键在于理解控制流逻辑:若要求有且仅有一个启用时才执行其专属逻辑(互斥模式),应使用 if-elif-fi 链;若允许多个包同时启用并各自执行(并行模式),则需用多个独立的 if 语句。

✅ 正确写法(互斥执行,优先匹配 package1):

if [[ "$package1" == "ON" ]]; then
    # package1 启用时执行的逻辑
    echo "Activating package1..."
    # 示例操作
    chown "$username." "/home/$username/domains/$domain/public_html/.htaccess"
elif [[ "$package2" == "ON" ]]; then
    # 仅当 package1 为 OFF 且 package2 为 ON 时执行
    echo "Activating package2..."
    # 其他专属操作(可不同于 package1)
    chmod 644 "/home/$username/domains/$domain/public_html/.htaccess"
fi

✅ 正确写法(并行执行,各自独立判断):

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

if [[ "$package2" == "ON" ]]; then
    echo "Running package2 setup..."
    # 可包含完全不同的操作,例如创建日志目录
    mkdir -p "/var/log/$domain/package2"
    chown "$username:www-data" "/var/log/$domain/package2"
fi

⚠️ 常见错误与注意事项:

  • elseif 是无效关键字 —— Bash 中必须写作 elif(无空格、无 e 开头);
  • 字符串比较务必使用 [[ ]] 并加双引号包裹变量(如 "$package1"),防止空值或含空格字符串导致语法错误;
  • == 在 [[ ]] 中可用,但 POSIX 兼容脚本建议统一用 =;
  • 不要遗漏 fi,每个 if/elif 必须有对应结束;
  • 若两个变量可能同时为 "ON",需明确业务需求:互斥?叠加?还是报错退出?可在开头添加校验:
    if [[ "$package1" == "ON" && "$package2" == "ON" ]]; then
        echo "Error: Only one package can be enabled at a time." >&2
        exit 1
    fi

? 总结:选择 if-elif-fi 实现单路分支(类似 switch),选择连续 if 实现多路并行。结合清晰的注释与防御性变量引用,即可构建健壮、可维护的条件化 Bash 脚本逻辑。