![Bash获取以列表为变量的间接变量扩展的长度](https://linux22.com/image/181862/Bash%E8%8E%B7%E5%8F%96%E4%BB%A5%E5%88%97%E8%A1%A8%E4%B8%BA%E5%8F%98%E9%87%8F%E7%9A%84%E9%97%B4%E6%8E%A5%E5%8F%98%E9%87%8F%E6%89%A9%E5%B1%95%E7%9A%84%E9%95%BF%E5%BA%A6.png)
假设我们有:
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[@]}"