¿Hay alguna manera de hacer algo como PHP $array[] = 'foo';
en bash vs hacer:
array[0]='foo'
array[1]='bar'
¿Hay alguna manera de hacer algo como PHP $array[] = 'foo';
en bash vs hacer:
array[0]='foo'
array[1]='bar'
Respuestas:
Sí hay:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
Manual de referencia de Bash :
En el contexto donde una instrucción de asignación está asignando un valor a una variable de shell o índice de matriz (ver Arreglos), el operador '+ =' se puede usar para agregar o agregar al valor anterior de la variable.
ARRAY
es solo un marcador de posición para un nombre de variable real. Incluso si sus índices de matriz no son secuenciales, agregar con +=
simplemente se asignará al índice más alto + 1.
${myarray[@]}
: hacer referencia a una variable de matriz como si fuera un escalar es lo mismo que acceder a su elemento 0; en otras palabras: $myarray
es lo mismo que ${myarray[0]}
.
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 ${#array[@]}
no contiguos, 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í le mostramos 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
${array[@]: start[:count]}
Devuelve recuento de elementos. o, si no se especifica, todos los elementos restantes . comenzando en el siguiente elemento: - Si inicio> = 0: desde el elemento. cuyo índice es> = inicio. - Si comienza <0: desde el elemento. cuyo índice es (último índice de matriz + 1) - abs (inicio); PRUEBA: si abs (inicio)> (último índice de matriz + 1), se devuelve una cadena nula. Si se especifica count, se devuelven tantos elementos, incluso si sus índices no son contiguos desde el inicio.
${array[-1]}
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
arr=("${arr[@]}" "new")
si tiene elementos con espacios en ellos
Si su matriz siempre es secuencial y comienza en 0, puede hacer esto:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Si inadvertidamente usa espacios entre el signo igual:
array[${#array[@]}] = 'foo'
Entonces recibirá un error similar a:
array_name[3]: command not found
+=
sintaxis (consulte la respuesta de @ e-t172) es (a) más simple y (b) también funciona con matrices que no son contiguas y / o no comienzan con 0.
+=
se agregara, por ejemplo, la versión 2
$arr += ($el)
parece dividir la cadena por espacio y agregar cada uno de los elementos.
Con una matriz indexada, puede hacer algo como esto:
declare -a a=()
a+=('foo' 'bar')