Bashで間接配列のサイズを取得する方法は?

Bashで間接配列のサイズを取得する方法は?

評価を使用しないでください。

これはうまくいきません:

astr=(a b c)    
str="#astr[@]"
echo "${!str}"

答え1

ヒントからここ、私はこれをすることができました:

astr=(a b c)
declare -n astrRef="astr"
echo ${#astrRef[@]}

また、これらの配列を作成するか、単に間接割り当てによって作成することもできます。

declare -n astrRef="astr"
astrRef=(d e f)
declare -p astrRef astr
astrRef+=(g)
declare -p astrRef astr

答え2

これはどうですか?少なくとも効果があります。バッシュ3.x上:

astr=(a b c)
str=astr[@]              # Our reference to an array
local arr=("${!str}")    # Copy into an array using indirect ref
echo ${#arr[*]}
# 3

bstr=("a foo" "a bar" "a fox" "a buzz")
str=bstr[@]
local arr=("${!str}")
echo ${#arr[*]}
# 4

関数にローカルでlocal作業変数を保持するためにキーワードを使用しますが、これはオプションです。arr実際には、bash制限のために配列の要素arrに(間接的に)アクセスするためにも使用できます。たとえば、次のようになります。

echo ${arr[1]}       # Print 2nd element
echo ${#arr[1]}      # ... print its size

(テスト済みバッシュ 3.1.23、バッシュ4.3.48および4.4.12)

関連情報