Agregue un nuevo elemento a una matriz sin especificar el índice en Bash

Resuelto Darryl Hein asked hace 14 años • 7 respuestas

¿Hay alguna manera de hacer algo como PHP $array[] = 'foo';en bash en lugar de hacer:

array[0]='foo'
array[1]='bar'
Darryl Hein avatar Dec 23 '09 15:12 Darryl Hein
Aceptado

Sí hay:

ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')

Manual de referencia de Bash :

En el contexto donde una declaración de asignación asigna un valor a una variable de shell o índice de matriz (consulte Matrices), el operador '+=' se puede usar para agregar o agregar al valor anterior de la variable.

También:

Cuando += se aplica a una variable de matriz mediante asignación compuesta (consulte Matrices a continuación), el valor de la variable no se anula (como ocurre cuando se usa =) y se agregan nuevos valores a la matriz comenzando en uno mayor que el índice máximo de la matriz. (para matrices indexadas)

Etienne Dechamps avatar Dec 23 '2009 09:12 Etienne Dechamps

Como señala Dumb Guy , es importante tener en cuenta si la matriz comienza en cero y es secuencial. Dado que puede realizar asignaciones y desarmar índices no contiguos, ${#array[@]}no siempre es el siguiente elemento al final de la matriz.

$ array=(a b c d e f g h)
$ array[42]="i"
$ unset array[2]
$ unset array[3]
$ declare -p array     # dump the array so we can see what it contains
declare -a array='([0]="a" [1]="b" [4]="e" [5]="f" [6]="g" [7]="h" [42]="i")'
$ echo ${#array[@]}
7
$ echo ${array[${#array[@]}]}
h

Aquí se explica cómo obtener el último índice:

$ end=(${!array[@]})   # put all the indices in an array
$ end=${end[@]: -1}    # get the last one
$ echo $end
42

Eso ilustra cómo obtener el último elemento de una matriz. A menudo verás esto:

$ echo ${array[${#array[@]} - 1]}
g

Como puede ver, debido a que estamos tratando con una matriz dispersa, este no es el último elemento. Sin embargo, esto funciona tanto en matrices dispersas como contiguas:

$ echo ${array[@]: -1}
i
Dennis Williamson avatar Dec 23 '2009 10:12 Dennis Williamson
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
ghostdog74 avatar Dec 23 '2009 09:12 ghostdog74