2010-01-06 8 views

Respuesta

74
$ arr=(1 2 3) 
$ arr+=(4) 
$ echo ${arr[@]} 
1 2 3 4 

Dado que Bash usa matrices dispersas, no debe usar el recuento de elementos ${#arr} como índice. Sin embargo, puede obtener una gran variedad de índices de la siguiente manera:

$ indices=(${!arr[@]}) 
+1

Gracias! Parece mucho más simple que algunos códigos que he visto ... – Joe

8
foo=(a b c) 
foo=("${foo[@]}" d) 
for i in "${foo[@]}"; do echo "$i" ; done 
2

La sintaxis bastante oscura para anexar al final de una matriz en bash es:

myarr[${#myarr[*]}]=”$newitem” 
+0

Como la respuesta de Dennis Williamson señala, esto es incorrecto en algunos casos; Los arreglos bash son escasos, y el índice $ {# myarr [*]} puede no ser el último índice. –

2

que añadir a lo que Ignacio ha sugerido en otra respuesta:

foo=(a b c) 
foo=("${foo[@]}" d) # push element 'd' 

foo[${#foo[*]}]="e" # push element 'e' 

for i in "${foo[@]}"; do echo "$i" ; done 
1
$ for i in "string1" "string2" "string3" 
> do 
> array+=($i) 
> done 
$ echo ${array[@]} 
string1 string2 string3 
0

Aunque la pregunta se responde y es bastante viejo, me gustaría compartir una solución de espacio de nombres, ya que funciona mucho más rápido que cualquier otro formas, excepto por la respuesta de ennukiller (en mis pruebas de 100k líneas, ganó ~ 12 segundos contra mi ~ 14 segundos, mientras que la solución para agregar listas tardaría unos minutos).

Usted puede utilizar el siguiente truco:

# WORKS FASTER THAN THESE LAME LISTS! ! ! 
size=0;while IFS= read -r line; do 
    echo $line 
    ((++size)) 
    eval "SWAMP_$size='$line'" 
done 

o se puede hacer lo siguiente:

#!/bin/bash 
size=0 
namespace="SWAMP" 

ArrayAppend() { 
    namespace="$1" 
    # suppose array size is global 
    new_value="$2" 
    eval "${namespace}_$size='$2'" 
    eval "echo \$${namespace}_$size" 
    ((++size)) 
} 

ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 

Mientras el intérprete se encuentra en la lista de etiquetas, aquí hay un enlace para object oriented bash.

+0

¡No use 'eval' para la asignación (especialmente en la entrada del usuario)! ** su código está sujeto a la inyección de código y es altamente inseguro ** (¡y por lo tanto está roto)! así que ... es incluso más lamer que las listas cojas ':)'. –

+0

Por cierto, si su único objetivo es sorber su archivo línea por línea en una matriz, con Bash≥4 debe usar 'mapfile':' mapfile -t lines

+0

Aunque, si me preguntas, puedo mostrarte una forma muy poco conocida de usar 'eval' de forma segura ... –

Cuestiones relacionadas