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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:45:42