Diccionarios en Bash

Este es uno de los capítulos del tutorial Scripts en Bash. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Una característica interesante son los diccionarios en Bash o arrays asociativos. Se trata de un elemento que va definido por pares clave valor. Básicamente es como un array, pero en lugar de que el índice sea numérico es una clave, definida por ti.

Esto lo puedes entender como dos arrays, un array de claves y un array de valores, donde para el mismo índice tienes una clave y un valor. Así, por ejemplo, en la clave puedes definir el nombre de un archivo y en el valor, definir algunas características de ese archivo. Con esto, ya te puedes hacer una idea fantástica, de las posibilidades de este tipo de estructura.

Diccionarios en Bash

Diccionarios en Bash

Antes que nada una observación importante, y es que este tipo de estructuras están solo disponibles a partir de Bash versión 4.0, con lo que tienes que tener muy en cuenta esto a la hora de implementar tus scripts. Recuerda que para comprobar la versión de Bash que tienes instalada, tienes que ejecutar /bin/bash --version. Esto te podría servir en tu propio script para definir la implementación del mismo en función de una u otra versión.

Declarando un diccionario

Al contrario de lo que viste en el caso de los arrays, en el caso de los diccionarios, hay que declararlos de forma explícita. Es decir, por ejemplo,

declare -A telefonos

Por otro lado para añadir valores a un diccionario, una vez que ya lo hayas declarado, lo puedes hacer conforme al ejemplo siguiente,

declare -A telefonos
telefonos[Juan]='123'
telefonos[Pedro]='456'
telefonos[Andres]='789'

También es posible añadir valores en una sola línea. Así por ejemplo, lo puedes hacer conforme ves a continuación, recordando declarar el diccionario previamente,

declare -A telefonos
telefonos=([Juan]='123' [Pedro]='456' [Andres]='789')

Accediendo al contenido de los diccionarios en Bash

Ahora que ya sabes como declarar diccionarios en Bash, el siguiente paso es acceder a su contenido. Por su puesto, que se trata de acceder de todas las formas, tanto de uno en uno, como de forma masiva. Pero además tienes que acceder no solo al valor, sino a la clave. En este caso la pareja clave-valor es lo que realmente cobra importancia.

Así, para acceder a un elemento concreto tienes que ejecutar la siguiente instrucción, por ejemplo,

echo ${telefonos[Juan]}

Para acceder a los valores del diccionario tienes dos opciones,

  • echo ${telefonos[@]}
  • echo ${telefonos[*]}

En ambos casos el resultado será,

456 123 789

Mientras que si lo que quieres es obtener las claves, en este caso, los propietarios de esos números de teléfono, la instrucción a ejecutar será,

echo ${!telefonos[*]}

Igual que sucede en el caso de los valores, también puedes hacer lo mismo para el caso de las claves. Es decir, también puedes obtener todas las claves con echo ${!telefonos[@]}.

Si quiere iterar entre los valores del diccionario tan solo tienes que ejecutar,

for i in ${telefonos[@]}
do
    echo $i
done

Y lo mismo puedes hacer para el caso de las claves, que además puedes combinar como puedes ver en el siguiente ejemplo,

for i in ${!telefonos[@]}
do
    echo "El telefono de $i es ${telefonos[$i]}"
done

También, como hiciste con los arrays en Bash, es posible extraer varios valores de golpe. Por ejemplo,

echo ${telefonos[@]:1:2} 

Cuantos elementos tiene el diccionario

Este procedimiento es exactamente igual que el que utilizaste con los arrays, simplemente tienes que utilizar #. Así, para saber cuantos teléfonos tienes guardados, tan solo tienes que ejecutar,

echo ${#telefonos[@]}

Evidentemente, el número de valores es exactamente al número de claves.

Operaciones con diccionarios

Para eliminar un pareja clave valor de tu diccionario, tienes que ejecutar la siguiente instrucción,

unset telefonos[Juan]

Por supuesto que puedes añadir nuevos elementos a nuestro diccionario, como has visto al principio de este artículo. Pero no solo esto, si no que además puedes añadir varios en una única línea,

telefonos+=([Ana]=123 [Irene]=456)

Indicarte que si intentas añadir una pareja clave valor, en el que la clave ya existe, lo único que harás será sustituir su valor. En este último caso, si ahora ejecutas telefonos+=[Irene]=777 lo que conseguirás será cambiar el teléfono de Irene.

Para eliminar un diccionario, tienes que utilizar de nuevo unset. Así si quieres borrar la agenda de teléfonos que has estado utilizando de ejemplo en este capítulo del tutorial, tendrás que ejecutar la siguiente instrucción,

unset telefonos

Cuidado con los espacios

En Bash siempre tienes que tener cuidado con los espacios, pero en el caso de los índices de los diccionarios deberás tener un especial cuidado, para no cometer un fallo.

Y es que es posible definir telefonos+=([Ana Maria]=456), sin embargo, si intentas ejecutar unset telefonos[Ana Maria], te arrojará un error. Para ser correcto debes poner entre comillas, ya sean simples o dobles.

Pero es mas, el mismo problema tendrás en el caso de que utilices una variable para la clave. Es decir,

clave='Ana Maria'
unset telefonos[$clave]

Para resolverlo tienes que utilizar dobles comillas, es decir,

unset telefonos["$clave"]

Conclusiones

Como has podido ver los diccionarios son muy similares a los arrays, aunque por supuesto con sus particularidades. Solo tienes que prestar especial atención, por un lado a la versión de Bash y, por supuesto, al uso de los espacios, en especial en las claves del diccionario,


Más información,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *