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.