Bash中case语句匹配/etc/os-release ID字段异常求助
问题排查与解决
从typeset -p chk_distro的输出declare -- chk_distro="\"centos\""可以明确:变量chk_distro的实际值是带双引号的字符串"centos",而你case语句中匹配的是不带双引号的centos,两者内容不一致,所以无法匹配。
原因分析
/etc/os-release中的ID字段行格式为ID="centos",你当前的提取命令直接把等号后的"centos"(包含双引号)赋值给了变量,导致变量内容带引号,和case里的匹配模式不匹配。
修正方案
提取字段时去掉双引号即可,修改提取命令:
# 用awk的gsub去掉双引号 chk_distro=$(grep -w "ID" /etc/os-release | awk 'BEGIN{FS="="} {gsub(/"/, "", $2); print $2}') # 或者用grep的perl正则直接提取不带引号的内容 # chk_distro=$(grep -wPo 'ID="\K[^"]+' /etc/os-release) echo "$chk_distro" case "$chk_distro" in "centos" ) echo "Distro matched";;; * ) echo "No match found";;; esac
修改后,chk_distro的值会是纯centos,case语句就能正确匹配。
内容的提问来源于stack exchange,提问作者saikat
相关产品推荐
相关产品推荐

