假设我们有:
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
而不是b
as抱怨)。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[@]}"