繁体   English   中英

bash中的关联数组名称数组

[英]Array of associative array names in bash

我正在尝试使用bash中的数组来管理关联数组列表,而我似乎无法找到哪些不正确。

我正在尝试做什么:

array=(a b c d)

for i in ${array[@]}; do
    declare -A $i
done

a[key]=avalue
b[key]=bvalue
c[key]=cvalue
d[key]=dvalue

这一切似乎工作正常,因为我可以通过引用${a[key]}手动返回值就好了。

但是,当我试图迭代使用array变量时,它并没有真正给我我所期望的。

for index in ${array[@]}; do
  echo ${index[key]}
done

回来就像我要跑的一样

for index in ${array[@]}; do
  echo $index
done

我觉得我错过了一些简单的东西,但寻找答案并没有找到任何解决方案。 任何援助将不胜感激。

这是一个解决方案,使用shell间接 这适用于任何支持关联数组的bash 间接必须包含整个引用,包括下标,这有点尴尬。

for index in "${array[@]}"; do
  indexkey=${index}[key]
  echo "${!indexkey}"
done

使用现代bash (至少v4.3),您可以使用nameref声明来创建别名。 这样更方便,因为您可以使用具有相同别名的不同键:

for index in "${array[@]}"; do
  declare -n subarray=$index
  echo "${subarray[key]}"
done

接近解释的东西。

正如Etan Reisner在评论中指出的那样,这个问题在Bash FAQ条目中有一定篇幅。 但是,在我编写的那一天,该FAQ条目包括免责声明“检修此页面需要一些时间和工作”,而且FAQ条目目前还不像人们所希望的那样清晰。 所以这是我的简短摘要:

  1. declare (和其他相关的内置函数,包括exportlocaltypeset )评估它们的参数。 因此,您可以在declare语句中构建变量名称。

  2. 由于declare也可以用于赋值(只要你使用相同的声明),你可以在declare语句中建立一个索引变量名。

  3. 如果您使用的是bash4.3或更高版本,则可以使用namerefs(typeset typeset -ndeclare -n )来模拟数组值。 这真的是你可以从bash函数返回一个数组的唯一方法,但它仍然有点尴尬,因为它要求函数的调用者提供一个带有数组名称的参数; 此外,它不是完全健壮的,因为名称将在函数的范围内使用,因此它可能被局部变量遮蔽。 需要注意。

  4. 使用变量间接可能没有其他充分的理由。 如果您发现自己需要它,请考虑是否可以采用不同的方式构建程序。 您可以使用字符串连接折叠关联键。 例如:

     my_array[${place}:${feature}] 

    只要${place}没有值包含冒号(当然,您可以使用不同的字符而不是冒号),将会工作。

  5. 小心钥匙。 如果数组被声明为关联的,则通常或多或少地评估键,但如果它是普通的索引数组,则将键计算为算术表达式。 结果是

     declare -A assoc declare -a indexed key=42 # This assigns the element whose key is "key" assoc[key]=foo # This assigns the element whose key is 42 indexed[key]=foo # If $key had not been defined, the above would have assigned # the element whose key was 0, without an error message 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM