você deve lidar com essas coisas nos índices de avaliação. e você pode indiretamente através de os índices da sua variável indireta se você fizer uma matriz.
a=(abc1 def2 ghi3 jkl4 mno5)
r=('a[c=${#a[@]}]' a\[i] a\[@])
for i in 0 1 2 3 4 5
do c=
printf "<%s>\n" "${!r-${!r[i<c?1:2]}}"
printf "\n\tindex is $i and count is $c\n\n"
done
<abc1>
index is 0 and count is 5
<def2>
index is 1 and count is 5
<ghi3>
index is 2 and count is 5
<jkl4>
index is 3 and count is 5
<mno5>
index is 4 and count is 5
<abc1>
<def2>
<ghi3>
<jkl4>
<mno5>
index is 5 and count is 5
Como os índices de bash
são baseados em 0, a contagem total de objetos de matriz sempre funcionará para um mais do que o índice de conjunto mais alto e, portanto:
c=
echo "${a[c=${#a[@]}]-this index is unset}" "$c"
this index is unset 5
... o parâmetro se expande para a palavra padrão, se houver alguma.
Se um não for fornecido:
c=
${!r}
echo "$c"
5
... não há mal nenhum.
No loop eu rastreio uma variável $i
ndex e verifico se ela é pelo menos tão grande quanto $c
ount. Quando é menor, eu expandi o $r
eference var para a[i]
porque é um índice válido, mas quando é igual ou maior, eu expandi o $r
ef para todo o $a
rray.
Aqui está em uma função:
ref_arr(){
local index=-1 count=
local ref=( "$1[ count= \${#$1[@]} ]"
"$1[ index ]" "$1[ @ ]"
) && printf "input array '%s' has '%d' members.\n" \
"$1" "${!ref-${count:?invalid array name: "'$1'"}}"
while [ "$((index+=1))" -lt "$count" ]
do printf "$1[$index] == '%s'\n" "${!ref[1]}"
done
}
some_array=(some "dumb
stuff" 12345\'67890 "" \
'$(kill my computer)')
ref_arr some_array
ref_arr '$(echo won'\''t work)'
input array 'some_array' has '5' members.
some_array[0] == 'some'
some_array[1] == 'dumb
stuff'
some_array[2] == '12345'67890'
some_array[3] == ''
some_array[4] == '$(kill my computer)'
bash: count: invalid array name: '$(echo won't work)'