尋找動態建立的名稱引用的陣列中的元素數量

尋找動態建立的名稱引用的陣列中的元素數量

我發現了一個類似的問題這裡,但它似乎並不相同,並且沒有一個答案提供我想要的輸出。我有一個數組,我想透過使用動態生成的名稱存取它來查找它包含多少個元素。

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

通過bash-4.3或以上,您可以使用 namerefs:

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

或者你可以隨時使用eval。無論如何,不要誤以為使用bashnamerefs 是更安全eval。與 for 一樣eval,您仍然需要確保 的內容$Name是有效的 shell 變數名稱。當您展開或 時,類似的值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用於間接參數擴充)。

答案2

您可以eval明確地使用它,但不要過度使用它:

eval "len=\${#$Name[@]}"

相關內容