Bash脚本 - 通过"变量"变量名来迭代关联数组列表

Ind*_*ded 6 unix linux bash associative-array

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

我通过列出其所有键并获取值来迭代单个关联数组,即.

for key in "${!queue1[@]}" do
    echo "key : $key"
    echo "value : ${queue1[$key]}"
done
Run Code Online (Sandbox Code Playgroud)

棘手的部分是关联数组的名称是变量变量,例如,给定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
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助!

Sha*_*hin 3

这里的困难源于以下事实:间接扩展 ( ${!nameref}) 的语法与从关联数组中提取键的语法 ( ${!array[@]}) 冲突。我们只能拥有其中之一,而不能同时拥有两者。

尽管我对使用持谨慎态度eval,但我看不到使用它来提取间接引用关联数组的键的方法:

keyref="queue${count}[@]"
for key in $(eval echo '${!'$keyref'}'); do ... ; done
Run Code Online (Sandbox Code Playgroud)

eval但是,在从给定键的数组中提取值时,您可以避免并使用间接扩展。请注意,[key]后缀必须是扩展的一部分:

valref="queue${count}[$key]"
echo ${!valref}
Run Code Online (Sandbox Code Playgroud)

将其放在上下文中:

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
Run Code Online (Sandbox Code Playgroud)