[*]
Este es el segundo artículo que forma parte de Bash Arrays. En el artículo anterior discutimos cómo usar. está trabajando Matrices indexadas en Bash. En esta guía discutiremos sobre Matriz asociativa Bash detallado con ejemplos en Linux.
Las matrices asociativas se basan en pares clave-valor. En algunos idiomas también se le 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 específica de la matriz. Una matriz asociativa usa un «Llave» para representar el valor en lugar de las posiciones del índice.
Profundicemos y veamos cómo se usan las matrices asociativas en bash.
Tabla de Contenidos
Inicializar matriz asociativa
A diferencia de una matriz indexada, no puede crear una matriz asociativa sin usar. inicializar declare
Mando.
Utilizar el declare
Comando con -A
Bandera.
$ declare -A STAR_PLAYERS=()
Ahora una matriz vacía llamada «STAR_PLAYERS» creado. También puede agregar elementos a la matriz a medida que se inicializa, si lo desea.
$ 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 de un signo igual sin espacios. No es necesario utilizar una coma o un 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" )
Mostrar elementos de matriz
Tienes que usar eso 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 conoce la diferencia *
y @
y cómo funciona con matrices, lea la sección «Bucle sobre elementos de matriz» en nuestro Bash por bucle Manual.
Cuando intenta imprimir los elementos de la matriz sin usar *
o @
, la salida está vacía.
$ echo $STAR_PLAYERS
Incluso si observa la salida anterior, solo se imprimen los valores, no las claves. Los valores que ha impreso no se ordenarán. Puede capturar el valor de un artículo en particular con su clave.
$ echo $STAR_PLAYERS[Brazil]
Agregar nuevos elementos a la matriz
Agregar un nuevo elemento a la matriz es fácil. 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 utilizar la misma clave que ya existe en la matriz, el valor se sobrescribirá con el nuevo.
$ STAR_PLAYERS[England]="Sterling"
$ echo $STAR_PLAYERS[@]
Agregar nuevos elementos a la matriz
También puede agregar elementos a una matriz utilizando la siguiente sintaxis.
$ STAR_PLAYERS+=([Spain]="Ramos")
$ echo $STAR_PLAYERS[@]
Imprimir par clave-valor
A partir de los ejemplos anteriores, es posible que haya entendido que solo se imprimen los valores. Puede obtener la lista de claves simplemente anteponiendo que "!"
Icono con la matriz.
$ echo $!STAR_PLAYERS[@]
Si desea imprimir la clave y el valor al mismo tiempo, puede utilizar el for loop
.
for elem in "$!STAR_PLAYERS[@]" do echo "key : $elem" -- "value: $STAR_PLAYERS[$elem]" done
Longitud de la matriz asociativa
Puede determinar la longitud de la matriz asociativa, es decir, el número total de elementos en la matriz, utilizando prefijos "#"
Icono con la matriz. Esto también es común con las matrices indexadas.
$ echo $#STAR_PLAYERS[@]
Verifique si hay un elemento en la matriz
A veces, es posible que desee verificar que el elemento ya existe en la matriz antes de procesar un elemento en particular. Hay muchas formas de hacer esto, pero a continuación se muestra la forma más sencilla.
Yo uso la declaración condicional con el -n
Bandera que comprueba si la longitud de la cadena devuelta por $STAR_PLAYERS[Argentina]
no es cero. Expande la clave dada y el valor se compara con eso. -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, después de que se haya inicializado la matriz, no puede agregar nuevos elementos a la matriz o cambiar valores dentro de la matriz. Junto con declare
Comando que tienes que usar -r
Bandera.
$ declare -r -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Rooney" )
$ STAR_PLAYERS[Spain]="Ramos"
$ STAR_PLAYERS[England]="Sterling"
$ echo $STAR_PLAYERS[@]
Quitar elementos
Si desea eliminar un elemento específico de la matriz, puede unset
Comando con el nombre de la clave del elemento. Por ejemplo, si quiero 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 reinicializando la matriz como se muestra a continuación.
$ echo $STAR_PLAYERS[@]
$ declare -A STAR_PLAYERS=()
Quitar matriz
Si desea eliminar la matriz, puede usar el nombre de la matriz sin una clave.
$ unset STAR_PLAYERS
diploma
En este artículo vimos qué son las matrices asociativas en bash y algunas de sus funciones. La desventaja de bash es que tienes que escribir algo de lógica manualmente o usar herramientas externas para obtener el resultado que deseas. Por ejemplo, si necesito convertir matrices asociativas a objetos json, tengo que usar jq Herramienta no integrada en Bash. Aquí es donde debe intentar usar Python, que tiene métodos fáciles de usar cuando necesita trabajar con matrices y otras estructuras de datos.