同様の質問が見つかりましたここしかし、同じではないようで、答えのどれも私が望む結果を提供しません。配列があり、動的に生成された名前を使用して配列にアクセスして、含まれる要素の数を確認したいと思います。
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
。とにかく、bash
namerefを使うのが良いと思う間違いを犯さないでください。より安全比較する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
間接パラメータ拡張の場合)