2012-11-09 183 views
6

我有一个关联数组的变量列表,我想要遍历并检索它们的键/值对。Bash脚本 - 通过关联数组列表遍历“变量”变量名

我遍历单个关联数组,通过列出所有的键和获取值,即。

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

现有答案是很大程度上外的日期中的在bash 4.3 namevar支持的上下文(然后)。 –

回答

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 
+0

现货! ++的信息性解释。谢谢! – Indecided

1

我能够使之与下面的脚本工作:如果任意键中包含空格,

for count in {1..5} ; do 
    for key in $(eval echo '${!q'$count'[@]}') ; do 
     eval echo '${q'$count"[$key]}" 
    done 
done 

注意它打破。如果您想处理复杂的数据结构,请使用更强大的Perl语言。

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 
+0

这似乎遍历数组中的值(而不是数组中的键)。我想你可以在某些工作中使用该值来挖掘关键字,但是非唯一值可能存在问题。 – doubleDown

+0

间接引用适用于访问数组值,但不适用于键。详情请参阅我的回答。 –