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

如何在Zsh中创建名称源自变量的关联数组及子数组?

Zsh中创建值为普通数组的关联数组的正确实现方法

问题背景

需要在Zsh中创建一个关联数组,其值为名称格式如keyv的普通数组。原尝试代码如下:

#!/bin/zsh

$key='key'

typeset -A associative_array
typeset -a "${(p)key}v"
"${(p)key}v"=( value1 )
"${(p)key}v"+=( value2 )
associative_array[${key}]="${(p)key}v"

运行时出现错误:./test.sh:7: unknown file attribute:,错误位于"${(p)key}v"=( value1 )行。

错误原因

  1. 变量赋值语法错误:$key='key'中多余了$,正确赋值应为key='key'。
  2. 动态变量赋值方式不支持:Zsh不允许直接通过"${(p)key}v"=( value1 )这种格式给动态命名的数组赋值,(p)参数展开仅用于取值,不能作为赋值的左值。

可行实现方法

方法1:使用Zsh名称引用(nameref,推荐)

nameref是Zsh提供的安全特性,可创建指向目标变量的引用,操作引用等同于操作目标变量,避免eval的安全风险:

#!/bin/zsh

key='key'

# 声明关联数组
typeset -A associative_array
# 创建名称为keyv的普通数组
typeset -a "${key}v"
# 建立名称引用,arr指向${key}v对应的数组
nameref arr="${key}v"

# 给数组赋值
arr=( value1 )
arr+=( value2 )

# 将数组名存入关联数组
associative_array[$key]="${key}v"

# 测试访问:通过关联数组的值获取对应数组内容
nameref target_arr="${associative_array[$key]}"
echo "数组内容:${target_arr[@]}"

方法2:使用eval(不推荐,存在安全风险)

如果必须使用动态变量名赋值,可借助eval,但需确保key的值是可信的,避免注入风险:

#!/bin/zsh

key='key'

typeset -A associative_array
typeset -a "${key}v"

# 通过eval给动态命名的数组赋值
eval "${key}v=( value1 )"
eval "${key}v+=( value2 )"

associative_array[$key]="${key}v"

# 测试访问数组内容
eval "echo \${${associative_array[$key]}[@]}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:42:45