我发现了一个类似的问题这里,但它似乎并不相同,并且没有一个答案提供我想要的输出。我有一个数组,我想通过使用动态生成的名称访问它来查找它包含多少个元素。
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[@]}"