Arrays

Una buena referencia.

Los arrays se generan con paréntesis: array=(uno dos tres). Al igual que en otros lenguajes, se indexan desde 0. Para evocar un elemento del array hay que utilizar los corchetes:

$ people=("Anna" "Bob" "Charlie")
$ echo ${people[1]}
Bob

Los índices no tienen por qué ser números:

array=([padre]="Pedro" [madre]="Mich")

Se pueden imprimir todos los elementos del array con ${array[*]}, y el número de elementos en el array con ${#array[@]}:

$ echo ${people[*]}
Anna Bob Charlie
$ echo ${#people[@]}
3
$ echo ${#people[*]}
3
$ echo ${people[${#people[@]}-1]}
Charlie
$ echo ${people[2]}
Charlie

Se pueden añadir elementos indicando el índice

$ people[3]="Debbie"
$ echo ${people[*]}
Anna Bob Charlie Debbie

y por tanto asegurándonos de meterlo siempre en el último elemento:

$ people[${#people[@]}]="Ellen"
$ echo ${people[*]}
Anna Bob Charlie Debbie Ellen

En este último ejemplo, ${#array[@]}devuelve la longitud del array; como el índice es la longitud menos uno, sería el último índice disponible.

Otra forma de añadir un elemento en la última posición es utilizar +=:

$ people+=("Frank")
$ echo ${people[@]}
Anna Bob Charlie Debbie Ellen Frank

Además es posible especificar los índices directamente al declarar el array:

$ newpeople=([1]="Barry" [2]="Chris" [0]="Allan")
$ echo ${newpeople[@]}
Allan Barry Chris

Copiar un array

Copiar un array requiere especificar que la variable destino es un array y asegurarse de que se transfieren todos los elementos del mismo. La forma correcta es

newArray=(${oldArray[@]})

Todas las demás formas no son eficaces:

$ a=("Zero" "One" "Two")
$ b=$a
$ echo $b
Zero
$ echo ${b[1]}

$ c=${a[@]}
$ echo ${c}
Zero One Two
$ echo ${c[1]}

$ d=(${a[@]})
$ echo ${d}
Zero
$ echo ${d[1]}
One

Extraer el índice

Para sacar el número de índices, se puede utilizar !:

$  array=("perro" "gato" "conejo" "ratón")
$ echo ${!array[@]}
0 1 2 3

Esto es útil para construir loops en los que quieras extraer el índice de un elemento dentro de un array:

for item in ${array[@]} ; do
  echo ${item}
done

Crear un array a partir de un string separado por espacios

Mientras se uitilicen los paréntesis para definir un array, es posible utilizar el input de una variable separada por espacios o nuevas líneas:

$ palos="Oros Bastos Espadas Copas"
$ echo $palos
Oros Bastos Espadas Copas
$ palos_array=($palos)
$ echo ${palos_array[2]}
Espadas

Eliminar elementos

Para eliminar un elemento se utiliza unset y se especifica el índice a eliminar

$ unset ${people[1]}
$ echo ${people[@]}
Anna Charlie Debbie Ellen Frank