Bash中如何使用键值对实现系统包管理器自动检测
Bash检测系统包管理器的精简实现
方案1:Bash 4.0+ 关联数组实现(推荐)
该版本通过关联数组存储对应关系,额外定义有序数组控制检测优先级,完全匹配你原有逻辑:优先级更高的包管理器(如dnf优先于yum)会覆盖低优先级的赋值结果。
#!/bin/bash # 定义关联数组存储「包管理器: 对应发行版」映射 declare -A PM_MAP=( [apt]="Debian/Ubuntu" [yum]="RHEL/Fedora/CentOS" [dnf]="RHEL/Fedora/CentOS" [zypper]="SLES" [apk]="Alpine" ) # 按优先级从低到高定义检测顺序 PM_ORDER=(apt yum dnf zypper apk) # 检测赋值函数 detect_package_manager() { # 清空原有变量避免干扰 unset MANAGER DISTRO # 遍历检测 for pm in "${PM_ORDER[@]}"; do type "$pm" &> /dev/null && { MANAGER="$pm" DISTRO="${PM_MAP[$pm]}" } done # 可选:未检测到包管理器时抛出错误退出 if [[ -z $MANAGER ]]; then echo "错误:未识别当前系统的包管理器" >&2 exit 1 fi } # 调用函数执行检测 detect_package_manager # 后续可直接使用$MANAGER和$DISTRO变量 # echo "包管理器:$MANAGER,发行版系列:$DISTRO"
方案2:兼容低版本Bash实现(无关联数组依赖)
如果运行环境Bash版本低于4.0(如CentOS 7自带的Bash 3.2),可以用普通索引数组存储键值对,通过字符串拆分读取内容:
#!/bin/bash # 按优先级从低到高存储,格式为「包管理器|发行版名称」 PM_LIST=( "apt|Debian/Ubuntu" "yum|RHEL/Fedora/CentOS" "dnf|RHEL/Fedora/CentOS" "zypper|SLES" "apk|Alpine" ) detect_package_manager() { unset MANAGER DISTRO for item in "${PM_LIST[@]}"; do # 拆分字符串获取包管理器和对应发行版 pm="${item%%|*}" distro="${item#*|}" type "$pm" &> /dev/null && { MANAGER="$pm" DISTRO="$distro" } done [[ -z $MANAGER ]] && { echo "错误:未识别当前系统的包管理器" >&2; exit 1; } } # 调用检测 detect_package_manager
内容的提问来源于stack exchange,提问作者YorSubs
相关产品推荐
相关产品推荐

