我正在尝试使用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条目还不是很清晰。因此,这是我的简要摘要:
declare
(和其他相关的内置命令,其中包括export
,local
,和typeset
)评估他们的论点。因此,您可以在declare
语句中建立变量名。
由于declare
还可以用于分配值(只要使用相同的声明),因此可以在声明语句中建立索引变量名称。
如果您使用的是bash4.3或更高版本,则可以使用namerefs(typeset -n
或declare -n
)来模拟数组值。这实际上是从bash函数返回数组的唯一方法,但是仍然有些尴尬,因为它要求函数的调用者提供带有数组名称的参数。此外,它并不完全健壮,因为该名称将在函数范围内使用,因此它可能会被局部变量遮盖。需要小心。
使用变量间接访问可能没有其他充分的理由。如果发现自己需要它,请考虑是否可以以不同的方式构造程序。您可以使用字符串串联折叠关联键。例如:
my_array[${place}:${feature}]
只要没有${place}
包含冒号的值就可以工作(当然,您可以使用其他字符代替冒号)。
小心钥匙。如果声明一个数组为关联数组,则该键或多或少地按正常方式求值,但是如果它是一个普通索引数组,则该键作为算术表达式求值。结果是
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] 删除。
我来说两句