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.
Esto funciona bien con bash 3.2.48 (OS X 10.8.2). Tenga en cuenta que ARRAYes 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.
mklement0
3
¿Hay algo así en bash versión 4.2.24 (1)?
Ali Ismayilov
195
Es importante tener en cuenta que ARRAY + = ('foo') es muy diferente de ARRAY + = 'foo', que agrega la cadena 'foo' a la entrada con la tecla más baja (?).
@Jas: Para acceder a toda la matriz, debe usar ${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: $myarrayes lo mismo que ${myarray[0]}.
mklement0
76
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:
Buena cosa; nunca se supo que la sintaxis de extracción de subcadenas también podría aplicarse a las matrices; las reglas, determinadas por prueba y error, son (bash 3.2.48): ${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.
mklement0
3
@mklement: en Bash 4.2, puede usar subíndices de matriz negativos para acceder a los elementos que cuentan desde el final de la matriz. ${array[-1]}
Pausado hasta nuevo aviso.
Es bueno saberlo, gracias. OS X (a partir de 10.8.2) todavía usa 3.2.48, y stackoverflow.com/questions/10418616/… me dice que, desafortunadamente, "Apple usa una versión bastante antigua de Bash, ya que no envían código con licencia bajo GPL3 ".
mklement0
49
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}""new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}""newest")
$ echo ${arr[@]}
a new newest
agradable para las versiones de bash que no admiten la semántica del operador + = explicado por e-t172
akostadinov
12
es una buena solución compatible con versiones anteriores, pero tenga en cuenta que si alguno de los elementos existentes tiene espacios, se dividirán en varios elementos; utilizar arr=("${arr[@]}" "new")si tiene elementos con espacios en ellos
kbolino
1
Esto también se puede usar para empujar frente a la matriz, que es justo lo que necesito.
Tomáš Zato - Restablece a Monica el
29
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:
Sí, puede, pero la +=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.
mklement0
Honestamente, esta solución (para mí) funciona mejor que el "+ =", porque con este último la longitud a veces es incorrecta (aumenta en dos al agregar un elemento) ... ¡así que prefiero esta respuesta! :)
Pierpaolo Cira
Esto también funciona en versiones anteriores de bash, antes de que +=se agregara, por ejemplo, la versión 2
Zoey Hewll
1
Esto también funciona cuando los elementos tienen espacios: $arr += ($el)parece dividir la cadena por espacio y agregar cada uno de los elementos.
Max
5
Con una matriz indexada, puede hacer algo como esto:
Respuestas:
Sí hay:
Manual de referencia de Bash :
fuente
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.Aquí le mostramos cómo obtener el último índice:
Eso ilustra cómo obtener el último elemento de una matriz. A menudo verás esto:
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:
fuente
${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]}
fuente
arr=("${arr[@]}" "new")
si tiene elementos con espacios en ellosSi su matriz siempre es secuencial y comienza en 0, puede hacer esto:
Si inadvertidamente usa espacios entre el signo igual:
Entonces recibirá un error similar a:
fuente
+=
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:
fuente