E sobre isso, que funciona pelo menos em bash 3.x e acima:
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
Usamos a palavra-chave local
para manter nossa variável de trabalho arr
local na função, mas isso é opcional. Na verdade, devido à limitação do bash, arr
também pode ser usado para acessar os elementos no array (indireto), como:
echo ${arr[1]} # Print 2nd element
echo ${#arr[1]} # ... print its size
(testado em bash 3.1.23 , bash 4.3.48 e 4.4.12)