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 indirection的解决方案这将与任何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(和其他相关的内置命令,其中包括exportlocal,和typeset)评估他们的论点。因此,您可以在declare语句中建立变量名

  2. 由于declare还可以用于分配值(只要使用相同的声明),因此可以在声明语句中建立索引变量名称。

  3. 如果您使用的是bash4.3或更高版本,则可以使用namerefs(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
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章