bash循环关联数组与变量数组名称

Z0O*_*0OM 1 bash associative-array

我有很多关联数组,但我只想使用 1 个循环。按给定名称选择 for 循环数组

我想用变量选择/构建数组名称的一部分,然后用该名称循环,但它不起作用。

与 OUTPUT3 和 OUTPUT4 类似,但语法错误。

对于输出 3,我收到:“bash 错误替换”

对于输出 4,我收到:“仅数组名和 0”

#!/bin/bash
clear

declare -A a1 a2 a3

a1['1']="1-1V"

a2['1']="2-1V"
a2['2']="2-2V"

a3['1']="3-1V"
a3['2']="3-2V"
a3['3']="3-3V"

# 1 OUTPUT WORKS
for i in ${!a1[*]}
do
echo -e "$i : ${a1[$i]}"
done

# 2 OUTPUT WORKS
for i in ${!a2[*]}
do
echo -e "$i : ${a2[$i]}"
done

# 3 OUTPUT - WRONG SYNTAX
selectkey="3"
for i in ${!a$selectkey[@]}
do
echo -e "$i : ${a$selectkey[$i]}"
done

# 4 OUTPUT - WRONG SYNTAX
key="3"
aselect="a${key}[*]"
# THIS ECHO WORKS
echo -e "ARRAY: ${!aselect}"

for i in ${!aselect[@]}
do
echo -e "$i : ${aselect[$i]}"
done
Run Code Online (Sandbox Code Playgroud)

更新

解决办法是nameref|declare -n

这现在对我有用:

#!/bin/bash
clear

declare -A a1 a2 a3

a1['1']="1-1V"

a2['1']="2-1V"
a2['2']="2-2V"

a3['1']="3-1V"
a3['2']="3-2V"
a3['3']="3-3V"

varname="a3"
counter=1

declare -n refname=${varname}

for i in "${!refname[@]}"
do
echo -e "$counter ${refname[$counter]}"
counter=$((counter+1))
done
Run Code Online (Sandbox Code Playgroud)

gle*_*man 5

使用“nameref”:declare -n a=b使变量a成为变量的别名b

# 3 OUTPUT - use a "nameref"
selectkey="3"
declare -n ary="a$selectkey"

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

输出

3 : 3-3V
2 : 3-2V
1 : 3-1V
Run Code Online (Sandbox Code Playgroud)

关联数组本质上是无序的。

对于#4,您正在使用“间接扩展”,如Shell 参数扩展中所述,但您无法使用该技术获取数组的索引。