如何在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 )行。
错误原因
- 变量赋值语法错误:
$key='key'中多余了$,正确赋值应为key='key'。 - 动态变量赋值方式不支持: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
相关产品推荐
相关产品推荐

