
我發現了一個類似的問題這裡,但它似乎並不相同,並且沒有一個答案提供我想要的輸出。我有一個數組,我想透過使用動態生成的名稱存取它來查找它包含多少個元素。
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
。無論如何,不要誤以為使用bash
namerefs 是更安全比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[@]}"