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

¿Hay alguna manera de hacer algo como PHPs $array[] = 'foo'; en bash vs doing:

 array[0] = 'foo' array[1] = 'bar' 

Sí hay:

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

Manual de referencia de Bash :

En el contexto en el que una statement de asignación asigna un valor a una variable de shell o un índice de matriz (ver Arrays), el operador ‘+ =’ puede usarse para anexar o agregar al valor anterior de la variable.

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

 $ array=(abcdefgh) $ 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 

A continuación se detalla 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á esto:

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

Como puede ver, porque 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 
 $ declare -a arr $ arr=("a") $ arr=("${arr[@]}" "new") $ echo ${arr[@]} a new $ arr=("${arr[@]}" "newest") $ echo ${arr[@]} a new newest 

Si su matriz es siempre secuencial y comienza en 0, puede hacer esto:

array[${#array[@]}] = 'foo'

${#array_name[@]} obtiene la longitud de la matriz

Con una matriz indexada, puedes hacer algo como esto:

 declare -aa=() a+=('foo' 'bar')