¿Hay una manera de hacer algo como los PHP $array[] = 'foo';
en bash vs haciendo:Añadir un nuevo elemento a un conjunto sin especificar el índice en Bash
array[0] = 'foo'
array[1] = 'bar'
¿Hay una manera de hacer algo como los PHP $array[] = 'foo';
en bash vs haciendo:Añadir un nuevo elemento a un conjunto sin especificar el índice en Bash
array[0] = 'foo'
array[1] = 'bar'
Si se encuentra:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
En el contexto en el que una instrucción de asignación asigna un valor a una variable de shell o un índice de matriz (ver Ar rayos), el operador '+ =' se puede usar para añadir o agregar al valor anterior de la variable.
Si la matriz es siempre secuencial y comienza en 0, entonces usted puede hacer esto:
array[${#array[@]}] = 'foo'
${#array_name[@]}
tiene la longitud de la matriz
Sí, puede, pero la sintaxis '+ =' (vea 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 "+ =", porque con esta última la duración es a veces incorrecta (aumenta en dos al agregar un elemento) ... ¡así que prefiero esta respuesta! :) –
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
bueno para las versiones de bash que no admiten la semántica del operador + = explicado por e-t172 – akostadinov
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 múltiples elementos; use 'arr = (" $ {arr [@]} "" new ")' si tiene elementos con espacios en ellos – kbolino
Esto también se puede usar para presionar en frente de la matriz, que es justo lo que necesito. –
Como Dumb individuo señala, es importante tener en cuenta 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=(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í es cómo conseguir 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 conseguir el último elemento de una matriz. A menudo se ve esto:
$ echo ${array[${#array[@]} - 1]}
g
Como se puede ver, debido a que estamos tratando con una matriz dispersa, este no es el último elemento. Esto funciona en ambas matrices dispersas y contiguas, sin embargo:
$ echo ${array[@]: -1}
i
cosas geniales; nunca supo que la sintaxis de extracción de subcadenas se podría aplicar también a las matrices; las reglas, determinadas por prueba y error, son (bash 3.2.48): '$ {array [@]: start [: count]}' Devuelve count elems. o, si no se especifica, todos _remaining_ elems. a partir del siguiente elem .: - Si inicio> = 0: desde el elem. cuyo índice es> = inicio. - Si inicio <0: desde el elem. cuyo índice es (último índice de matriz + 1) - abs (inicio); CAVEAT: si abs (inicio)> (último índice de matriz + 1), se devuelve una cadena nula. Si se especifica recuento, se devuelven tantos elementos, incluso si sus índices no son contiguos desde el inicio. – mklement0
@mklement: en Bash 4.2, puede usar subíndices de matriz negativa para acceder a los elementos contados desde el final de la matriz. '$ {array [-1]}' –
Eso es bueno saber, gracias. OS X (a partir de 10.8.2) todavía usa 3.2.48, y http://stackoverflow.com/questions/10418616/does-darwin-macos-modify-bash me dice que, desafortunadamente, "Apple usa una versión bastante antigua de Bash, ya que no envían código que tiene licencia bajo GPL3 ". – mklement0
Con una matriz indexada, puede a algo como esto:
declare -a a=()
a+=('foo' 'bar')
Esto funciona muy bien con fiesta 3.2.48 (OS X 10.8. 2). Tenga en cuenta que 'ARRAY' es solo un marcador de posición para un nombre de variable real. Incluso si sus índices de matriz no son secuenciales, al agregar '+ =' simplemente se asignará al índice más alto + 1. – mklement0
¿Hay algo así en la versión 4.2.24 (1) de bash? –
Es importante tener en cuenta que ARRAY + = ('foo') es diferente de ARRAY + = 'foo', que agrega la cadena 'foo' a la entrada con la tecla más baja (?). – TheConstructor