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


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

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

544
2017-12-23 08:59


origen


Respuestas:


Sí hay:

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

Manual de referencia de Bash:

En el contexto en el que una declaración 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.


1073
2017-12-23 09:02



Como Tonto señala, es importante observar si la matriz comienza en cero y es secuencial. Dado que puede realizar asignaciones y deshacer índices no contiguos ${#array[@]} no es siempre 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

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

58
2017-12-23 10:38



$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest

35
2017-12-23 09:11



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

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

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


16
2017-12-23 09:03



Con una matriz indexada, puedes hacer algo como esto:

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

2
2018-02-18 19:17