Tabla de contenidos
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 cualquier otro nombre
El nombre formal de los diccionarios es matrices asociativas. También se denominan tablas hash y mapas hash. Son una estructura de datos que funciona de manera similar a una matriz regular, pero con una diferencia significativa.
Una matriz es una colección de valores de datos que se encuentran en una estructura de datos. Para acceder a cualquiera de los valores de datos, que se conocen como elementos de matriz, debe conocer su posición en la matriz. La posición de un elemento de la matriz en la matriz se conoce como su índice, por lo que estos tipos de matrices se conocen como matrices indexadas. Son el tipo de matrices más utilizado.
Sin embargo, tienen un inconveniente. ¿Cómo accede a un elemento de matriz si no conoce su posición dentro de la lista? Debe ejecutar todos los elementos de la matriz, probando para ver si el valor en esa ubicación es el que está buscando.
Las matrices asociativas superan ese problema. No usan números enteros para identificar de forma única los elementos de la matriz. Usan palabras únicas conocidas como palabras clave. Puede recuperar el valor de un elemento de matriz utilizando su palabra clave, independientemente de dónde se encuentre dentro de la matriz. Con una matriz indexada, los números enteros que representan las posiciones dentro de la matriz están en orden ascendente. Las palabras clave de una matriz asociativa pueden estar en cualquier orden.
Puede buscar un valor en una matriz asociativa buscando con su palabra clave. Buscar una palabra y recuperar su valor asociado simula buscar una palabra en un diccionario y encontrar su significado. Es por eso que las matrices asociativas se conocen como 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 --versión
La máquina utilizada para investigar este artículo 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. La -A
opción (asociativa) le dice a Bash que será una matriz asociativa y no una matriz indexada.
declarar -A acrónimos
Esto crea una matriz asociativa llamada «acrónimos».
Para poner algunos datos en nuestra matriz, necesitamos proporcionar palabras clave y valores. Podemos hacer esto usando este formato:
nombre-matriz [clave] = Valor
Agreguemos algunos elementos de la matriz:
acrónimos [ACK] = Reconocimiento
acronyms [BGP] = "Protocolo de puerta de enlace fronteriza"
acrónimos [CIDR] = "Enrutamiento entre dominios sin clases"
acrónimos [DHCP] = "Protocolo de configuración dinámica de host"
acrónimos [EOF] = "Fin del cuadro"
Esos 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 ingresaron en orden alfabético, pero se pueden ingresar en el orden que desee. 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 valores de la matriz, usamos comandos en este formato:
$ {nombre-matriz [clave]}
Podemos usar echo para enviar la salida a la ventana de la terminal:
echo $ {acrónimos [ACK]}
echo $ {acrónimos [DHCP]}
Usar bucles
Las matrices se prestan muy bien a ser utilizadas en bucles. Las matrices asociativas no son una excepción. Los bucles proporcionan formas eficientes de invocar una secuencia de acciones sin secciones repetitivas de código. Antes de ver los bucles, existe una forma eficaz de declarar matrices.
Creamos las matrices usando el declare
comando (la misma -A
opción que antes), pero proporcionamos las palabras clave y los valores como una lista en la línea de comando.
declare -A países = ([ALB] = Albania [BHR] = Bahréin [CMR] = Camerún [DNK] = Dinamarca [EGY] = Egipto)
El nombre de la matriz es «países» y está conectado a la lista de valores mediante 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á envolverla 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 matriz. El símbolo arroba » @
» se puede utilizar como comodín, es decir, todos los elementos de la matriz.
Este for
ciclo enumerará todas las palabras clave:
para introducir "$ {! countries [@]}"; hacer eco $ clave; hecho
Tenga en cuenta que las palabras clave no están necesariamente enumeradas 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 "$ {! acrónimos [@]}"
Podemos aumentar nuestro for
ciclo para imprimir las palabras clave y los valores al mismo tiempo.
para introducir "$ {! acrónimos [@]}"; echo "$ clave - $ {acrónimos [$ clave]}"; hecho
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 "$ {! acrónimos [@]}"
Comprobación de que existe 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 matriz.
Podemos verificar la presencia de un elemento de matriz usando el +_
operador » «. Tenga en cuenta que viene después de la palabra clave, no delante del nombre de la matriz como los operadores anteriores que hemos visto.
si [$ {acrónimos [EOF] + _}]; luego repita "Encontrado"; else echo "No encontrado"; fi
si [$ {acrónimos [FTP] + _}]; luego repita "Encontrado"; else echo "No encontrado"; fi
El elemento de la matriz con la palabra clave «EOF» se encuentra en la matriz, pero el elemento de la matriz con la palabra clave «FTP» no.
Adición de 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 seguir agregando nuevos elementos sin alcanzar un límite superior predefinido.
Para agregar un nuevo elemento a la matriz, usamos el +=
operador » «.
países + = ([FJI] = Fiji)
echo "$ (# países [@]}"
echo $ {países [FJI]}
El número de elementos en la matriz ahora es seis, y la búsqueda de la nueva palabra clave encuentra el elemento de la matriz y devuelve su valor.
Eliminación de matrices y elementos de matriz
El unset
comando se utiliza para eliminar elementos de la matriz. Si la palabra clave tiene espacios, envuélvala entre comillas.
acrónimos sin definir [EOF]
si [$ {acrónimos [EOF] + _}]; luego repita "Encontrado"; else echo "No encontrado"; fi
Para eliminar toda la matriz, utilícela unset
con el nombre de la matriz.
países desarmados
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. En realidad, estamos reemplazando el elemento de matriz que eliminamos anteriormente.
Recuperamos 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á colocar el nombre de la variable entre comillas.
clave = EOF
acrónimos [$ key] = "Fin del fotograma"
echo $ {acrónimos [EOF]}
echo $ {acrónimos [$ clave]}
Se creativo
Nuestros ejemplos han sido 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 piezas de información, todas relacionadas con una cosa, como las especificaciones de diferentes piezas de hardware de computadora:
declarar -Una especificación
especificación [CPU] = "Dual Core AMD Ryzen 5 3600"
especificación [Velocidad] = "3600 MHz"
especificación [Kernel] = "5.11.0-17-genérico x86_64"
especificación [Mem] = "1978.5 MiB"
especificación [Almacenamiento] = "32 GiB"
especificación [Shell] = "Bash"
echo $ {especificación [CPU]}
Escribir de forma eficiente en un idioma significa conocer los mecanismos y estructuras que ofrece, y seleccionar el más adecuado al problema que estás intentando resolver. Los arreglos asociativos le brindan una forma fácil de usar de almacenar datos que puede buscar por nombre, como un diccionario.