MacOS下Zsh:如何从两列状标量创建关联数组(哈希表)
问题
我有两个列状的标量值:
% echo $key hom doc fam echo $val 'home' 'Documents' 'Family'
我希望从中创建一个关联数组。我知道可以用以下方式创建关联数组:
declare -A my_assoc_arr my_assoc_arr=(hom home doc Documents fam Family)
但请问以现有形式(列状标量)处理$key和$val来创建关联数组的最简方法是什么?是否有其他关联语法,还是必须重新整理$key和$val以适配上述语法?
解决方案
方法1:多文件描述符逐行匹配(直观可靠)
通过文件描述符同时读取两个变量的内容,确保每行键对应每行值,直接完成赋值:
declare -A my_assoc_arr while read -r key_line && read -r val_line <&3; do # 可选:去掉值两端的单引号,不需要保留则删除此行 val_line=${val_line//\'/} my_assoc_arr["$key_line"]="$val_line" done <<< "$key" 3<<< "$val"
方法2:paste合并后循环解析
用paste命令将键和值的行一一对应合并,再逐行读取解析赋值:
declare -A my_assoc_arr paste <(echo "$key") <(echo "$val") | while read -r k v; do v=${v//\'/} my_assoc_arr["$k"]="$v" done
这种方式依赖进程替换,适合习惯管道操作的场景。
方法3:构造键值对序列适配已知语法
如果想沿用你熟悉的数组初始化语法,可以先把列状数据转换成空格分隔的键值对序列:
declare -A my_assoc_arr # 将列状内容转为数组 readarray -t keys <<< "$key" readarray -t vals <<< "$val" # 构造键值对参数 args=() for idx in "${!keys[@]}"; do clean_val=${vals[$idx]//\'/} args+=("${keys[$idx]}" "$clean_val") done # 初始化关联数组 my_assoc_arr=("${args[@]}")
注意:如果键或值包含空格,这种方式会出现解析错误,因此优先推荐前两种方法。
额外说明:关联数组的直接赋值语法
Bash支持直接通过键值对形式给关联数组赋值,比如:
my_assoc_arr["hom"]='home' my_assoc_arr["doc"]='Documents'
但对于批量处理列状数据,循环读取的方式效率更高。
内容的提问来源于stack exchange,提问作者user1146081
相关产品推荐
相关产品推荐

