如何将读取外部字典文件的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
相关产品推荐
相关产品推荐

