fatmawati achmad zaenuri / Shutterstock.com
Los diccionarios Bash le brindan mapas hash y matrices asociativas en scripts de shell de Linux. Le mostraremos cómo utilizar estas poderosas y útiles estructuras de datos en sus propios scripts de shell de Linux.
Una rosa con otro nombre
El nombre formal de los diccionarios es matriz asociativa. También se denominan tablas hash y mapas hash. Esta es una estructura de datos que funciona igual que una matriz normal, pero con una diferencia significativa.
Una matriz es un conjunto de valores de datos contenidos en una estructura de datos. Para acceder a cualquiera de los valores de datos, llamados elementos de matriz, necesita conocer su posición en la matriz. La posición de un elemento de la matriz en la matriz se conoce como índice, por lo que estos tipos de matrices se denominan matrices indexadas. Estos son los tipos de tablas más utilizados.
Sin embargo, tienen una desventaja. ¿Cómo acceder a un elemento de matriz si no conoce su posición en la lista? Debe iterar a través de todos los elementos de la matriz, probando para ver si el valor en esa ubicación es lo que está buscando.
Las matrices asociativas superan este problema. No utilizan números enteros para identificar de forma única los elementos de la matriz. Usan palabras únicas llamadas palabras clave. Puede recuperar el valor de un elemento de matriz utilizando su palabra clave, independientemente de su ubicación en la matriz. Con una matriz indexada, los números enteros que representan posiciones en la matriz están en orden ascendente. Las palabras clave en una matriz asociativa pueden estar en cualquier orden.
Puede buscar un valor en una matriz asociativa realizando una búsqueda con su palabra clave. Buscar una palabra y recuperar su valor asociado simula buscar una palabra en un diccionario y encontrar su significado. Esta es la razón por la que las matrices asociativas se denominan diccionarios.
Bash 4.0 o superior
Las matrices asociativas son compatibles con la versión 4.0 o superior del shell Bash. Si está utilizando una distribución de Linux actual, debería estar bien. Para verificar su versión de Bash, use este comando:
bash --version
La máquina utilizada para encontrar este elemento tiene instalado Bash 5.1.4, así que estamos listos para comenzar.
Principios básicos
Para crear una matriz asociativa en la línea de comandos de la terminal o en un script, usamos el comando Bash declare. los -A
La opción (asociativa) le dice a Bash que esta será una matriz asociativa, no una matriz indexada.
declare -A acronyms
Esto crea una matriz asociativa llamada «acrónimos».
Para poner datos en nuestra tabla, necesitamos proporcionar palabras clave y valores. Podemos hacerlo usando este formato:
array-name[key]=Value
Agreguemos algunos elementos de la matriz:
acronyms[ACK]=Acknowledgement
acronyms[BGP]="Border Gateway Protocol"
acronyms[CIDR]="Classless Inter-Domain Routing"
acronyms[DHCP]="Dynamic Host Configuration Protocol"
acronyms[EOF]="End of Frame"
Estos comandos definen cinco elementos de matriz. Tenga en cuenta que los valores están entre comillas si hay espacios en el valor. Nuestras palabras clave se han ingresado en orden alfabético, pero se pueden ingresar en el orden que elija. Las palabras clave deben ser únicas. Si intenta crear dos entradas con la misma palabra clave, el segundo valor que ingrese sobrescribirá al primero. Seguirá teniendo solo una entrada con esa palabra clave y se asociará con el segundo valor que agregó.
Para recuperar los valores de la matriz, usamos comandos en este formato:
${array-name[key]}
Podemos usar echo para enviar la salida a la ventana de la terminal:
echo ${acronyms[ACK]}
echo ${acronyms[DHCP]}
Usando bucles
Las tablas se prestan muy bien para ser utilizadas en bucles. Las matrices asociativas no son una excepción. Los bucles proporcionan una forma eficaz de invocar una secuencia de acciones sin repetir secciones de código. Antes de mirar los bucles, existe una forma eficaz de declarar matrices.
Creamos las tablas usando el declare
comando (el mismo -A
como antes), pero proporcionamos las palabras clave y los valores como una lista en la línea de comando.
declare -A countries=( [ALB]=Albania [BHR]=Bahrain [CMR]=Cameroon [DNK]=Denmark [EGY]=Egypt )
El nombre de la tabla es «país» y está conectado a la lista de valores por un signo igual » =
. «La lista de valores está entre paréntesis»()
«y cada palabra clave está entre corchetes»[]
Tenga en cuenta que no hay comas que separen los valores. Si tiene una cadena de valor que contiene espacios, deberá encerrarla entre comillas.
Para hacer que una matriz asociativa devuelva una palabra clave en lugar del valor, agregue un signo de exclamación «!
”Delante del nombre de la mesa. El símbolo «@
”Se puede utilizar como comodín, es decir, todos los elementos de la matriz.
Este for
bucle enumerará todas las palabras clave:
for key in "${!countries[@]}"; do echo $key; done
Tenga en cuenta que las palabras clave no se enumeran necesariamente en el orden en que se crearon, pero eso no importa. Las matrices asociativas no se basan en un índice ordenado.
También podemos utilizar la expansión de parámetros para enumerar todas las palabras clave. Se enumerarán en una línea, no una por línea.
echo "${!countries[@]}"
echo "${!acronyms[@]}"
Podemos aumentar nuestro for
bucle para imprimir palabras clave y valores al mismo tiempo.
for key in "${!acronyms[@]}"; do echo "$key - ${acronyms[$key]}"; done
Si queremos saber cuántos elementos hay en las matrices, podemos usar un hash «#» delante del nombre de la matriz en lugar de un signo de exclamación.
echo "${!countries[@]}"
echo "${!acronyms[@]}"
Verifique que exista un elemento de matriz
Si busca una palabra clave pero no existe tal elemento de matriz, el valor de retorno será una cadena vacía. A veces es útil tener un indicador diferente para la presencia o ausencia de un elemento de la matriz.
Podemos verificar la presencia de un elemento de matriz usando el «+_
«Operador. Tenga en cuenta que esto viene después de la palabra clave, no antes del nombre de la matriz como los operadores anteriores que hemos visto.
if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi
if [ ${acronyms[FTP]+_} ]; then echo "Found"; else echo "Not found"; fi
El elemento de la matriz con la palabra clave «EOF» está en la matriz, pero el elemento de la matriz con la palabra clave «FTP» no lo está.
Agregar elementos de matriz
Agregar nuevos elementos a una matriz asociativa es fácil. A diferencia de algunos lenguajes de programación, no necesita definir el tamaño de su matriz cuando la declara. Puede continuar agregando nuevos elementos sin alcanzar un límite superior predefinido.
Para agregar un nuevo elemento a la matriz, usamos el «+=
«Operador.
countries+=( [FJI]=Fiji )
echo "$(#countries[@]}"
echo ${countries[FJI]}
El número de elementos en la matriz ahora es seis, y una búsqueda de la nueva palabra clave encuentra el elemento en la matriz y devuelve su valor.
Eliminar matriz y elementos de matriz
los unset
El comando se usa para eliminar los elementos de la matriz. Si la palabra clave contiene espacios, escríbala entre comillas.
unset acronyms[EOF]
if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi
Para borrar toda la tabla, use unset
con el nombre de la mesa.
unset countries
Usar variables con matrices
El uso de variables con matrices asociativas es sencillo. En este ejemplo, estableceremos una clave de variable en la cadena «EOF». Usaremos la variable cuando agreguemos un nuevo elemento de matriz a la matriz. De hecho, estamos reemplazando el elemento de matriz que eliminamos anteriormente.
Recuperaremos el nuevo elemento de la matriz llamándolo con la nueva palabra clave y también, usando la variable. Si la palabra clave contiene espacios, deberá encerrar el nombre de la variable entre comillas.
key=EOF
acronyms[$key]="End of Frame"
echo ${acronyms[EOF]}
echo ${acronyms[$key]}
Para mostrar creatividad
Nuestros ejemplos fueron colecciones de información donde cada elemento de la matriz es independiente de todos los demás, como un diccionario. Cada uno es una definición única. Pero las matrices asociativas pueden contener fácilmente una variedad de información, toda relacionada con una cosa, como especificaciones para diferentes piezas de hardware de computadora:
declare -A specification
specification[CPU]="Dual Core AMD Ryzen 5 3600"
specification[Speed]="3600 MHz"
specification[Kernel]="5.11.0-17-generic x86_64"
specification[Mem]="1978.5 MiB"
specification[Storage]="32 GiB"
specification[Shell]="Bash"
echo ${specification[CPU]}
Escribir eficazmente en un idioma significa conocer los mecanismos y estructuras que ofrece, y seleccionar el más adecuado al problema que se intenta resolver. Las matrices asociativas le brindan una forma fácil de usar de almacenar datos que puede buscar por nombre, como un diccionario.