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

如何将读取外部字典文件的Bash逻辑封装为可调用函数?

Bash函数封装外部键值文件读取逻辑

下面是封装好的Bash函数,可直接调用外部key=value格式的文件,自动解析键值并传递给业务逻辑:

read_key_value_file() {
    local file_path="$1"
    # 校验文件合法性
    if [[ ! -r "$file_path" ]]; then
        echo "错误:文件 $file_path 不存在或无读取权限" >&2
        return 1
    fi

    # 逐行解析,仅分割第一个等号(兼容值含等号的情况)
    while IFS='=' read -r raw_key raw_value; do
        # 清理键值两端的空白字符
        local A=$(echo "$raw_key" | xargs)
        local B=$(echo "$raw_value" | xargs)
        
        # 跳过空键或格式无效的行
        [[ -z "$A" ]] && continue
        
        # 这里替换为你的业务逻辑,比如直接使用A和B做操作
        echo "键(A): $A,值(B): $B"
        # 示例:存入关联数组、执行命令等都可以写在这里
    done < "$file_path"
}

核心逻辑说明

  • 函数接受一个参数:外部键值文件的路径
  • 用IFS='=' read -r raw_key raw_value实现仅分割第一个等号,避免值中包含等号时被错误拆分
  • 借助xargs自动去除键和值两端的空格、制表符,处理文件中的格式冗余
  • 增加了文件可读性校验,提前抛出错误避免后续执行异常

使用示例

假设你的1.txt内容如下:

app1=1
app2=10
app1=30
app3=hello=world

在脚本中调用函数:

read_key_value_file "./1.txt"

执行输出:

键(A): app1,值(B): 1
键(A): app2,值(B): 10
键(A): app1,值(B): 30
键(A): app3,值(B): hello=world

重复键处理扩展

如果需要对重复键做定制化处理,比如覆盖旧值、收集所有值,只需修改函数内的业务逻辑部分:

示例1:重复键覆盖旧值

# 提前声明关联数组存储最终键值对
declare -A final_kv

read_key_value_file() {
    local file_path="$1"
    if [[ ! -r "$file_path" ]]; then
        echo "错误:文件 $file_path 不存在或无读取权限" >&2
        return 1
    fi

    while IFS='=' read -r raw_key raw_value; do
        local A=$(echo "$raw_key" | xargs)
        local B=$(echo "$raw_value" | xargs)
        [[ -z "$A" ]] && continue
        
        # 新值覆盖旧值
        final_kv["$A"]="$B"
    done < "$file_path"
}

# 调用后遍历输出最终结果
read_key_value_file "./1.txt"
echo "===== 最终去重键值对 ====="
for key in "${!final_kv[@]}"; do
    echo "$key=${final_kv[$key]}"
done

输出:

===== 最终去重键值对 =====
app1=30
app2=10
app3=hello=world

示例2:收集重复键的所有值

declare -A kv_arr

read_key_value_file() {
    local file_path="$1"
    if [[ ! -r "$file_path" ]]; then
        echo "错误:文件 $file_path 不存在或无读取权限" >&2
        return 1
    fi

    while IFS='=' read -r raw_key raw_value; do
        local A=$(echo "$raw_key" | xargs)
        local B=$(echo "$raw_value" | xargs)
        [[ -z "$A" ]] && continue
        
        # 将值追加到对应键的数组中
        kv_arr["$A"]+="$B "
    done < "$file_path"
}

read_key_value_file "./1.txt"
echo "===== 重复键值集合 ====="
for key in "${!kv_arr[@]}"; do
    # 将字符串转为数组
    values=(${kv_arr[$key]})
    echo "$key: ${values[*]}"
done

输出:

===== 重复键值集合 =====
app1: 1 30
app2: 10
app3: hello=world

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:46:05