我有一个关联数组的变量列表,我想迭代并检索它们的键/值对。
我通过列出其所有键并获取值来迭代单个关联数组,即。
for key in "${!queue1[@]}" do
echo "key : $key"
echo "value : ${queue1[$key]}"
done
棘手的部分是关联数组的名称是变量变量,例如给定count = 5,关联数组将命名为queue1,queue2,queue3,queue4,queue5。
我正在尝试根据计数替换上面的序列,但到目前为止,括号和eval的每个组合都没有产生更多的错误替换错误。例如:
for count in {1,2,3,4,5} do
for key in "${!queue${count}[@]}" do
echo "key : $key"
echo "value : ${queue${count}[$key]}"
done
done
非常感谢帮助!
答案 0 :(得分:3)
这里的困难源于间接扩展(${!nameref}
)的语法与从关联数组(${!array[@]}
)中提取键的语法冲突的事实。我们只能有一个,而不是两个。
我在使用eval
时很谨慎,我无法用它来提取间接引用的关联数组的键:
keyref="queue${count}[@]"
for key in $(eval echo '${!'$keyref'}'); do ... ; done
但是,在给定密钥的数组中提取值时,您可以避免使用eval
并使用间接扩展。请注意[key]
后缀必须是扩展的一部分:
valref="queue${count}[$key]"
echo ${!valref}
将此置于上下文中:
for count in {1..5} ; do
keyref="queue${count}[@]"
for key in $(eval echo '${!'$keyref'}'); do
valref="queue${count}[$key]"
echo "key = $key"
echo "value = ${!valref}"
done
done
答案 1 :(得分:1)
我能够使用以下脚本:
for count in {1..5} ; do
for key in $(eval echo '${!q'$count'[@]}') ; do
eval echo '${q'$count"[$key]}"
done
done
请注意,如果任何键包含空格,则会中断。如果您想处理复杂的数据结构,请使用更强大的语言,如Perl。
答案 2 :(得分:0)
我认为这可能有效(但未经测试)。关键是要对索引进行处理
作为变量的全名。 (也就是说,数组queue5
可以
被视为一系列名为queue5[this]
,queue5[that]
等的变量。
for count in {1,2,3,4,5} do
assoc="queue$count[@]"
for key in "${!assoc}" do
echo "key : $key"
val="queue$count[$key]"
echo "value : ${!val}"
done
done