Arrays en BASH

En Bash tenemos la posibilidad de usar arrays. Un array es una variable con varios elementos y tienen muchísima utilidad. Por ejemplo, para recoger el listado de archivos que hay en una carpeta.

Para crear un array hay varias formas, una de ellas es definir la variable del array y añadirle todos los elementos de golpe:

#!/bin/bash
numeros=(1 2 3 4 5)

Este script creará un array con cinco elementos (del 1 al 5).

También se puede usar esta otra forma:

#!/bin/bash
declare -a numeros=(1 2 3 4 5)

Mostrar todos los elementos del array

Si queremos mostrar el array completo podemos usar este sencillo comando:

echo ${numeros[@]}

Como se puede ver tiene una sintaxis muy fácil de recordar. Tan fácil que solo tendrás que consultarla unas diez veces antes de poder empezar a recordarla. No se puede decir que Bash tenga una sintaxis bonita.

También se puede usar con un asterisco en lugar de la arroba:

echo ${numeros[*]}

En realidad no es tan difícil de recordar. El $ es el símbolo que se usa para referirnos a las variables, las llaves son necesarias siempre que queremos acceder a los valores de un array y, por último, entre corchetes va el índice del elemento al que queremos acceder (en este caso el '*' se refiere a todos los elementos).

Hay una diferencia entre usar * y @ que explicaré en otra entrega.

Acceder a un elemento del array

Si queremos acceder a un elemento del array podemos usar la forma:

echo ${numeros[0]}

Al igual que sucede en la mayoría de los lenguajes de programación el primer elemento del array tiene el índice 0. Este ejemplo nos mostraría, por tanto, un 1.

Ojo, Bash no comprueba los límites de un array. Es posible hacer algo así sin tener ningún error:

echo ${numeros[10]}

De forma similar podemos cambiar un elemento del array:

#!/bin/bash

numeros=(1 2 3 4 5)
numeros[1]="Cambiado"
echo ${numeros[*]}

Este script mostrará el siguiente resultado:

1 Cambiado 3 4 5

Porque hemos modificado el segundo elemento (que tiene el índice 1).

También podemos añadir nuevos elementos:

#!/bin/bash

numeros=(1 2 3 4 5)
numeros[5]=6
echo ${numeros[*]}

Esto mostrará:

1 2 3 4 5 6

Recuerda, para modificar o añadir un elemento a un array se hace como con una variable normal, no se pone el $ al principio.

Si usamos un índice con un número mayor el resultado será, aparentemente, el mismo:

#!/bin/bash

numeros=(1 2 3 4 5)
numeros[10]=6
echo ${numeros[*]}

Esto mostrará:

1 2 3 4 5 6

La diferencia está en que, ahora, el 6 es el elemento con índice 10 y no índice 5 como tenía en el ejemplo anterior.

También podemos usar este método para crear un nuevo array:

#!/bin/bash

numeros[0] = 1
numeros[1] = 2

Es decir, cuando asignamos un elemento a una variable automáticamente se crea el array.

Índices de un array en BASH

Podemos ver qué índice tiene cada elemento del array usando:

echo ${!numeros[*]}

Usado en el ejemplo anterior quedaría:

#!/bin/bash

numeros=(1 2 3 4 5)
numeros[10]=6
echo "Contenido del array:"
echo ${numeros[*]}
echo "Índices del array:"
echo ${!numeros[*]}

Y mostraría:

$ ./arrays 
Contenido del array:
1 2 3 4 5 6
Índices del array:
0 1 2 3 4 10

El primer elemento tiene el índice 0, el segundo el índice 2,... y el último el índice 10 (porque así lo hemos querido).

Número de elementos en un array

Añadiendo el símbolo '#' tenemos el tamaño del array:

#!/bin/bash

numeros=(1 2 3 4 5)
echo ${#numeros[*]}

El tamaño de un elemento

Podemos conocer directamente el tamaño de un elemento del array usando la # al acceder a dicho elemento:
#!/bin/bash

numeros=(Primero Segundo Tercero)
echo ${#numeros[1]}

El resultado será un 7, que es el número de letras de la palabra “Segundo”.

Ahorrando teclas al crear un array

Cuando crearmos un array podemos ahorrarnos un montón de trabajo usando rangos:

#!/bin/bash

cifrasLetras=( {A..Z} {a..z} {0..9} )
echo ${cifrasLetras[*]}

Esto va a crear un array con el siguiente contenido:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Por supuesto podemos usar los rangos empenzando en la letra o el número que queramos:

#!/bin/bash

cifrasLetras=( {N..X} {b..m} {6..21} )
echo ${cifrasLetras[*]}

Que resultará en:

N O P Q R S T U V W X b c d e f g h i j k l m 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Un ejemplo real: meter el listado de archivos en un array

Algo bastante habitual suele ser meter un listado de archivos en un array y luego poder trabajar con ese array. Se puede hacer usando el comando ls dentro de unas comillas invertidas:

#!/bin/bash
ficheros=(`ls`)
echo ${ficheros[*]}
echo ${#ficheros[*]}

En la variable ficheros tendríamos el listado de los archivos y veríamos que el tamaño del array coincide con el número de archivos.

Ojo, si olvidásemos el paréntesis (que es lo que indica que estamos definiendo un array) se guardaría como una cadena:

#!/bin/bash
ficheros=`ls`
echo ${ficheros[*]}
echo ${#ficheros[*]}

El tamaño de este array sería siempre 1.

En la siguiente entrega vamos a ver los bucles for y pondré algunos ejemplos para trabajar con arrasys.

Autor:
Nivel: Principiante
Palabras clave:
Fecha publicado:
Fecha actualizado: 15-08-2016

Otros capítulos de la misma serie

Este capítulo es parte de la serie: Programación en BASH.

Y muchos más en preparación.

Disponible en los planes: Laravel hero PHP a tope