Shell脚本可通过读取/etc/os-release文件获取$ID等变量识别发行版,再用if分支调用对应包管理器(如apt、yum、dnf)安装软件,并通过检查命令存在性、root权限及添加状态提示增强健壮性。

要让Shell脚本根据系统发行版自动执行不同安装命令,关键在于准确识别系统类型,并据此调用对应的包管理器。这不需要手动查系统,而是通过读取标准文件、判断变量值来实现,既可靠又兼容主流Linux发行版。
读取 /etc/os-release 获取系统标识
所有现代Linux发行版都遵循LSB(Linux Standard Base)规范,在/etc/os-release中提供标准化的系统信息。脚本只需加载该文件,就能直接使用$ID、$VERSION_ID等变量:
- . /etc/os-release(注意点号后有空格)——等效于source /etc/os-release,把变量导入当前环境
- 常见$ID值包括:ubuntu、debian、centos、rocky、almalinux、fedora
- 可进一步用[ "$ID" = "ubuntu" ]或[[ $ID == "debian" ]]做精确匹配
用 if 分支分发安装逻辑
识别出系统后,用if/elif/else结构分别处理各发行版的安装命令。重点是保持命令语义一致(比如都装curl和jq),只变包管理器调用方式:
- Ubuntu/Debian:用apt update && apt install -y curl jq
- RHEL/CentOS 7 及更早:用yum install -y curl jq
- RHEL/CentOS 8+、Fedora、Rocky:用dnf install -y curl jq
- 可加else兜底,提示“不支持的系统”并退出
增强健壮性的实用技巧
真实环境中不能只靠$ID,还要考虑混合场景和权限问题:
- 检查command -v apt、command -v dnf是否存在,双重验证包管理器可用性
- 安装前加id -u判断是否为root,非root则报错退出,避免权限失败静默
- 对apt类系统,先执行apt update;对dnf/yum,可加--assumeyes避免交互阻塞
- 每条安装命令后用&&连接echo "✅ $pkg installed",便于定位哪步失败
一个最小可行示例
以下代码片段可直接复制使用,已适配 Ubuntu 22.04、CentOS 7、Rocky 9:
#!/bin/bash
. /etc/os-release
if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then
apt update && apt install -y curl jq
elif [[ "$ID" == "centos" ]] && [[ "$VERSION_ID" == "7" ]]; then
yum install -y curl jq
elif [[ "$ID" == "centos" || "$ID" == "rocky" || "$ID" == "almalinux" || "$ID" == "fedora" ]]; then
dnf install -y curl jq
else
echo "❌ Unsupported OS: $ID $VERSION_ID"
exit 1
fi


















