GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Scripting:matriz asociativa explicada con ejemplos

Este es el segundo artículo como parte de las matrices bash. En el artículo anterior, discutimos cómo trabajar con matrices indexadas en Bash . En esta guía, hablaremos sobre Bash Associative Array en detalle con ejemplos en Linux.

Las matrices asociativas funcionan en función de pares clave-valor. En algunos idiomas, también se llama diccionarios o mapas hash . La principal diferencia entre las matrices indexadas y asociativas es que las matrices indexadas funcionan según el valor del índice y cada elemento de la matriz se asigna a una posición de índice particular de la matriz. Una matriz asociativa usa una "clave" para mapear el valor en lugar de las posiciones del índice.

Profundicemos y veamos cómo usar una matriz asociativa en bash.

Inicializar matriz asociativa

A diferencia de una matriz indexada, no puede inicializar una matriz asociativa sin usar declare dominio.

Utilice declare comando con -A bandera.

$ declare -A STAR_PLAYERS=()

Ahora una matriz vacía llamada "STAR_PLAYERS" es creado. Si lo desea, también puede agregar elementos a la matriz directamente durante la inicialización.

$ declare -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Kane" )

En el código anterior, las claves están entre corchetes y los valores deben ir seguidos del signo igual sin espacios. No hay necesidad de usar una coma o punto y coma como separador entre elementos.

Para una mejor legibilidad, puede escribir los elementos de la matriz en varias líneas.

$ declare -A STAR_PLAYERS=(
 [Argentina]="Messi"
 [Brazil]="Neymar"
 [England]="Rooney"
)

Ver elementos de matriz

Tienes que usar el echo o printf comando en bash para imprimir el contenido de la matriz. Similar a cómo usamos la variable especial * y @ para imprimir la matriz indexada, se debe usar lo mismo para imprimir matrices asociativas también.

$ echo ${STAR_PLAYERS[@]}
$ echo ${STAR_PLAYERS[*]}

Hay una diferencia significativa entre * y @ y saber la diferencia entre * y @ y cómo funciona con una matriz, consulte la sección "Bucle sobre elementos de matriz" en nuestro Bash For Loop guía.

Si intenta imprimir los elementos de la matriz sin usar * o @ , la salida estará vacía.

$ echo ${STAR_PLAYERS}

Además, si observa el resultado anterior, solo se imprimen los valores y no las claves. Los valores que imprima no estarán ordenados. Puede tomar el valor de un elemento en particular usando su clave.

$ echo ${STAR_PLAYERS[Brazil]}

Añadir nuevos elementos a la matriz

Agregar un nuevo elemento a la matriz es simple. Todo lo que tiene que hacer es crear un nuevo par clave-valor como se muestra a continuación.

$ STAR_PLAYERS[Belgium]="Hazard"
$ echo ${STAR_PLAYERS[@]}

Si intenta usar la misma clave que ya está presente en la matriz, el valor se anulará con la nueva.

$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}

Añadir nuevos elementos a la matriz

También puede agregar elementos a una matriz usando la siguiente sintaxis.

$ STAR_PLAYERS+=([Spain]="Ramos")
$ echo ${STAR_PLAYERS[@]}

Imprimir par de clave y valor

De los ejemplos anteriores, es posible que haya entendido que solo se imprimen los valores. Puede obtener la lista de claves solo con el prefijo "!" símbolo con la matriz.

$ echo ${!STAR_PLAYERS[@]}

Si desea imprimir tanto la clave como el valor al mismo tiempo, puede usar el for loop .

for elem in "${!STAR_PLAYERS[@]}"
do
 echo "key : ${elem}" -- "value: ${STAR_PLAYERS[${elem}]}"
done

Longitud de la matriz asociativa

Puede obtener la longitud de la matriz asociativa, es decir, el número total de elementos presentes en la matriz anteponiendo "#" símbolo con la matriz. Esto también es común para las matrices indexadas.

$ echo ${#STAR_PLAYERS[@]}

Comprueba si el elemento está presente en la matriz

A veces, antes de realizar cualquier procesamiento con el elemento en particular, es posible que desee verificar si el elemento ya está presente en la matriz. Hay muchas formas de hacerlo, pero a continuación se muestra la forma más sencilla.

Estoy usando la declaración condicional con -n indicador que verificará si la longitud de la cadena devuelta de ${STAR_PLAYERS[Argentina]} es distinto de cero. Expande la clave dada y el valor se compara con el -n bandera.

if [[ -n "${STAR_PLAYERS[Argentina]}" ]] 
then
  echo "Element is present"
else
  echo "Element not present"
fi

Matriz asociativa de solo lectura

Puede hacer que una matriz asociativa sea de solo lectura. En un estado de solo lectura, una vez que se inicializa la matriz, no puede agregar nuevos elementos a la matriz ni modificar ningún valor dentro de la matriz. Junto con declare comando tienes que usar el -r bandera.

$ declare -r -A STAR_PLAYERS=(
 [Argentina]="Messi"
 [Brazil]="Neymar"
 [England]="Rooney"
)
$ STAR_PLAYERS[Spain]="Ramos"
$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}

Eliminar elementos

Si desea eliminar algún elemento en particular de la matriz, puede usar unset comando con el nombre de la clave del elemento. Por ejemplo, si deseo eliminar el elemento (Spain="Ramos" ), entonces la sintaxis debería ser la siguiente.

$ unset STAR_PLAYERS[Spain]

Vaciar una matriz

También puede eliminar todos los elementos de la matriz y dejarla vacía reiniciando la matriz como se muestra a continuación.

$ echo ${STAR_PLAYERS[@]}
$ declare -A STAR_PLAYERS=()

Eliminar matriz

Si desea eliminar la matriz, puede usar el nombre de la matriz sin ninguna clave.

$ unset STAR_PLAYERS

Conclusión

En este artículo hemos visto qué son los arreglos asociativos en bash y algunas de sus funcionalidades. El inconveniente con bash es que tienes que escribir algo de lógica manualmente o usar herramientas externas para lograr el resultado deseado. Por ejemplo, cuando tengo que convertir una matriz asociativa en objetos json, tengo que usar jq herramienta que no está integrada en bash. Aquí es donde debe intentar usar Python, que ofrece métodos fáciles de usar cuando tiene que trabajar con matrices y otras estructuras de datos.

Lectura relacionada:

  • Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos
  • Secuencias de comandos de Bash:bucle For explicado con ejemplos
  • Bash Scripting:funciones explicadas con ejemplos
  • Secuencias de comandos de Bash:variables explicadas con ejemplos
  • Redireccionamiento de Bash explicado con ejemplos
  • Comando Bash Echo explicado con ejemplos en Linux
  • Tutorial de Bash Heredoc para principiantes

Linux
  1. Cómo escribir un script Bash con ejemplos

  2. Matrices bash con ejemplos

  3. Declaración de Bash If-Else con ejemplos

  4. Arreglos AWK explicados con 5 ejemplos prácticos

  5. El último tutorial de Bash Array con 15 ejemplos

Bash Scripting - Comando Printf explicado con ejemplos

Bash Scripting:matriz indexada explicada con ejemplos

Comando Tr en Linux explicado con ejemplos

Bash Scripting Part2 – Bucles for y while con ejemplos

Tutorial de introducción a Bash Scripting con 5 ejemplos prácticos

Bash Script for Loop explicado con ejemplos