如何在bash中获取间接数组的大小?

如何在bash中获取间接数组的大小?

不使用评估。

这行不通:

astr=(a b c)    
str="#astr[@]"
echo "${!str}"

答案1

来自小费这里,我设法做到了这一点:

astr=(a b c)
declare -n astrRef="astr"
echo ${#astrRef[@]}

这还允许创建这样的数组或简单地通过间接赋值:

declare -n astrRef="astr"
astrRef=(d e f)
declare -p astrRef astr
astrRef+=(g)
declare -p astrRef astr

答案2

这个怎么样,至少适用于bash 3.x以上:

astr=(a b c)
str=astr[@]              # Our reference to an array
local arr=("${!str}")    # Copy into an array using indirect ref
echo ${#arr[*]}
# 3

bstr=("a foo" "a bar" "a fox" "a buzz")
str=bstr[@]
local arr=("${!str}")
echo ${#arr[*]}
# 4

我们使用local关键字来将工作变量保持arr在函数本地,但这是可选的。事实上,由于 bash 的限制,arr也可以用来访问(间接)数组中的元素,例如:

echo ${arr[1]}       # Print 2nd element
echo ${#arr[1]}      # ... print its size

(测试于bash 3.1.23、bash 4.3.48 和 4.4.12)

相关内容