查找动态创建的名称引用的数组中的元素数量

查找动态创建的名称引用的数组中的元素数量

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

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[@]}"

相关内容