Bash获取以列表为变量的间接变量扩展的长度

Bash获取以列表为变量的间接变量扩展的长度

假设我们有:

a=(1 2 3 4)
b=a

我想获得 a 到 b 的长度 一种方法可能是:

a=(1 2 3 4)
b="a[@]"
c=("${!b}")
echo ${#c[@]}

但我有兴趣看看是否有一个没有额外变量的解决方案

答案1

作为记录,in ,其中szsh的等价物是(其中也可以像 csh 中那样写)bash${!b}${(P)b}${#array[@]}$#array

$ a=(1 2 3 4) b=a
$ echo ${(P)#b}
4

在 中bash,如果你真的想使用${!b}间接,你总是可以这样做:

$ a=(1 2 3 4)
$ b='b[(b=${#a[@]}),0]'
$ echo "${!b}"
4

您可以使用同样的技巧来让变量动态扩展为以下元素的数量$a

$ typeset -n b='x[(x=${#a[@]}),0]'
$ echo "$b"
4
$ a+=(more)
$ echo "$b"
5

(如果 nameref 引用自身,则这里使用x而不是bas抱怨)。bash

或者你总是可以使用eval

$ a=(1 2 3 4) b=a
$ eval 'echo "${#'"$b"'[@]}"'
4

答案2

对于间接变量,这就是你必须这样做的方式。

使用 namerefs (bash 4.3+),你可以这样做

a=(1 2 3 4)
declare -n b=a
echo "${#b[@]}"

相关内容