動的に生成された名前が参照する配列の要素数を見つける

動的に生成された名前が参照する配列の要素数を見つける

同様の質問が見つかりましたここしかし、同じではないようで、答えのどれも私が望む結果を提供しません。配列があり、動的に生成された名前を使用して配列にアクセスして、含まれる要素の数を確認したいと思います。

declare -a array0=(2 4 2 5)  # contains 4 values
indx=0
Name="array$indx"            # create a name reference => array0

# I know how to obtain an indexed value by INDIRECT reference:
val0=${!Name[0]}
# I also know how to get array length using DIRECT name
len=${#array0[@]}

私が必要とするのは、要素の数を見つけることです配列0変数を使用した参照名前

len=${#!Name[@]}             # the syntax is incorrect

実装に関する提案はありますか?

編集する:
誤って以下を使用して配列エントリにアクセスしました。

val0=${!Name[0]}

indx = 0でのみ機能するため、配列から別の項目を取得するには空の文字列のみを返します。

val4=${!Name[4]}          #does not work

または

i=4
val4=${!Name[$i]}         # does not work

ベストアンサー1

Passbash-4.3以降では、namerefを使用できます。

a0=(a b c)
i=0
typeset -n Name="a$i"
echo "${#Name[@]}"

またはいつでもできます。使用eval。とにかく、bashnamerefを使うのが良いと思う間違いを犯さないでください。より安全比較するeval。 forと同様に、内容が有効なシェル変数名であることをeval確認する必要があります。$Name同様の値は拡張時にもx[`evil-command>&2`0]実行され続けます。evil-commandにも適用されます。$Name${#Name}${!var}

を使用すると、多次元配列ksh93を代わりに使用できます。

a[0]=(a b c)
i=0
echo "${#a[i][@]}"

zshスプレッド演算子を結合するより一貫した方法があります。

a0=(a b c)
i=0
name=a$i
echo ${(P)#name}

P間接パラメータ拡張の場合)

おすすめ記事