como obter o tamanho de um array indireto no bash?

0

Sem usar eval.

isso não funciona:

astr=(a b c)    
str="#astr[@]"
echo "${!str}"
    
por Aquarius Power 06.05.2016 / 02:04

2 respostas

2

De uma dica aqui , consegui fazer isso:

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

Isso também permite criar essa matriz ou simplesmente atribuir valores por meio de indireção:

declare -n astrRef="astr"
astrRef=(d e f)
declare -p astrRef astr
astrRef+=(g)
declare -p astrRef astr
    
por 06.05.2016 / 02:55
0

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)

    
por 29.06.2017 / 09:23