Expansão de substring de array com algum elemento indefinido

1

Acabei de descobrir um comportamento estranho ao indexar em matrizes bash com elementos indefinidos. Eu faço uma matriz com esses três elementos:

$ arry[3]=a
$ arry[4]=b
$ arry[5]=c

O array parece estar certo:

$ echo ${#arry[@]}
3
$ echo ${!arry[@]}
3 4 5

Mas se eu tentar obter os três primeiros valores na matriz, obtenho a para todos eles:

$ echo ${arry[@]:0:1}
a
$ echo ${arry[@]:1:1}
a
$ echo ${arry[@]:2:1}
a

Eu tenho que usar as chaves reais para obter os elementos que eu definir:

$ echo ${arry[@]:3:1}
a
$ echo ${arry[@]:4:1}
b
$ echo ${arry[@]:5:1}
c

Parece com expansão de substring "offset" significa o índice de matriz atual, e se não definido, Bash apenas continua rolando até encontrar um elemento set.

Reconhecendo que existe alguma maneira direta de obter o enésimo valor de um array indexado com algum elemento não definido?

    
por Claudio 08.03.2016 / 10:02

2 respostas

1

is there any straight forward way to get the nth value of an indexed array with some unset element?

Não sem uma matriz temporária, penso:

a=([3]=2 [1]=12 [12]=4 [23]=5)

a_indices=("${!a[@]}")

third_element=${a[${a_indices[2]}]}

ou

a_normalized=("${a[@]}")
third_element=${a_normalized[2]}

Essa é uma herança ksh. ksh e bash são os únicos shells que eu sei onde os arrays são escassos (ou em outras palavras são arrays associativos com chaves limitadas a inteiros positivos e numericamente ordenados em suas chaves).

Os arrays de todos os outros shells que eu conheço (zsh, yash, fish, csh, tcsh, rc, es ...) são matrizes normais ( e com índices começando em 1 como um (pelo menos eu) esperaria, não 0).

    
por 08.03.2016 / 14:50
0

De acordo com a Expansão de parâmetro no Bash

o :x retorna os elementos desse índice para o final.

os elementos :x:y retornam y da primeira extração.

Tem que ser vistas uma após a outra.

ar[2]=a
ar[3]=b
ar[5]=y
ar[6]=z

echo ${ar[@]:0}
# a b z y

echo ${ar[@]:0:3}
# a b z

echo ${ar[@]:4}
# y z
    
por 08.03.2016 / 14:38