You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash如何从ini文件提取指定person的public段groups、age参数

问题诊断

你代码的核心问题有3个:

  • awk 中/pattern/格式的正则匹配规则不会识别-v传递的变量,/a/的写法是固定匹配包含字符a的行,你传的变量a根本没有生效,这是硬编码能跑、传变量就失效的直接原因。
  • 你的 awk 匹配逻辑顺序有问题,会导致 public 段的首行被跳过,而且后续用lines[1]、lines[4]这种硬编码下标取值的方式非常脆弱,只要段内出现空白行、键顺序变化就会直接取不到值。
  • 变量扩展没有加引号,遇到带空格的路径/内容时会直接触发语法错误。
修复方案

适配原有循环逻辑的版本

保留你原来遍历persons数组的逻辑,修正 awk 变量匹配规则,同时改用键名匹配取值,不怕段内键顺序变化:

# 自定义要查询的person列表
persons=("person_0" "person_1" "person_2")
file="txt.ini"

for person in "${persons[@]}"; do
    echo "$person"
    # 用~运算符实现变量正则匹配
    section_content=$(awk -v pub_sec="$person:public" -v pri_sec="$person:private" '
        $0 ~ "^\[" pri_sec "\]$" {found=0}
        found {print}
        $0 ~ "^\[" pub_sec "\]$" {found=1}
    ' "$file")
    
    # 按键名匹配取值,不依赖行下标
    grouplist_values=""
    age_values=""
    while IFS='=' read -r key val; do
        case "$key" in
            groups) grouplist_values="$val" ;;
            age) age_values="$val" ;;
        esac
    done <<< "$section_content"
    
    echo "Group list = $grouplist_values"
    echo "Age = $age_values"
    echo ""
done

更高效的通用版本

不需要提前定义persons列表,一次 awk 调用就能解析整个ini文件的所有public段数据,自动适配任意数量的person条目:

file="txt.ini"
awk '
# 匹配section头
/^\[.*\]$/ {
    sec = substr($0, 2, length($0)-2)
    split(sec, sec_arr, ":")
    cur_person = sec_arr[1]
    is_public = (sec_arr[2] == "public")
    next
}
# 只处理public段的非空行
is_public && NF {
    split($0, kv, "=")
    if (kv[1] == "groups") groups[cur_person] = kv[2]
    if (kv[1] == "age") age[cur_person] = kv[2]
}
# 输出所有结果
END {
    for (p in groups) {
        print p
        print "Group list = " groups[p]
        print "Age = " age[p]
        print ""
    }
}
' "$file"

内容的提问来源于stack exchange,提问作者Gutek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:45:03