不使用评估。
这行不通:
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)