6

我有一个关联数组的变量列表,我想遍历并检索它们的键/值对。

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

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

非常感谢您的帮助!

4

3 回答 3

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
于 2012-11-09T10:59:03.547 回答
1

我能够使用以下脚本使其工作:

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

请注意,如果任何键包含空格,它会中断。如果要处理复杂的数据结构,请使用更强大的语言,例如 Perl。

于 2012-11-09T10:10:57.673 回答
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
于 2012-11-09T14:42:20.327 回答