変数配列名を持つ bash ループ連想配列

変数配列名を持つ bash ループ連想配列

連想配列が多いですが、ループを1つだけ使用したいと思います。与えられた名前でループ配列を選択する

変数を使用して配列名の一部を選択/構築し、その名前で繰り返したいが機能しません。

OUTPUT3とOUTPUT4に似ていますが、構文が正しくありません。

出力3の場合は「bash error replacement」と表示されます。

出力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

修正する

解決策は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

ベストアンサー1

「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

出力

3 : 3-3V
2 : 3-2V
1 : 3-1V

連想配列は本質的に順序がない。

#4の場合に記載されているように「間接拡張」を使用しています。シェルパラメータ拡張ただし、この手法を使用して配列のインデックスを取得することはできません。

おすすめ記事