Cómo usar matrices en Bash

9 feb 2024 4 min di lettura
Cómo usar matrices en Bash
Indice dei contenuti

Introducción

Las matrices son una de las estructuras de datos más utilizadas y fundamentales. Puede pensar en una matriz como una variable que almacena múltiples variables dentro de ella. Las matrices ofrecen una manera conveniente de representar y manipular un grupo de elementos de datos relacionados como una sola entidad.

En este artículo cubriremos las matrices Bash y explicaremos cómo usarlas en sus scripts Bash.

Golpe de matriz

Bash admite tipos de matrices indexadas numéricamente y asociativas unidimensionales. Se hace referencia a matrices numéricas mediante números enteros y asociativas mediante cadenas.

Se puede acceder a las matrices indexadas numéricamente desde el final utilizando índices negativos; el índice de -1 hace referencia al último elemento. Los índices no tienen que ser contiguos.

A diferencia de la mayoría de los lenguajes de programación, los elementos de la matriz Bash no tienen que ser del mismo tipo de datos. Esto significa que puede crear una matriz que contenga cadenas y números.

Bash no admite matrices multidimensionales y no es posible tener elementos de matriz que también sean matrices.

No hay límite para la cantidad máxima de elementos que se pueden almacenar en una matriz.

Creando matrices Bash

En Bash, las matrices se pueden inicializar mediante varios métodos.

Crear matrices indexadas numéricamente

Las variables de Bash no se escriben. Cualquier variable se puede utilizar como una matriz indexada sin declararla.

Para declarar explícitamente una matriz, use el comando incorporado declarar:

declare -a array_name

Una forma de crear una matriz indexada es utilizar el siguiente formulario:

array_name[index_1]=value_1
 array_name[index_2]=value_2
 array_name[index_n]=value_n

Donde index_* es un número entero positivo.

Otra forma de crear una matriz numérica es especificar la lista de elementos entre paréntesis, separados por espacios en blanco:

array_name=( element_1 element_2 element_N )

Cuando la matriz se crea usando el formulario anterior, la indexación comienza desde cero, es decir, el primer elemento tiene un índice de 0.

Creando matrices asociativas

Las matrices asociativas son un tipo de matriz en la que cada elemento se identifica mediante una clave única en lugar de un índice.

A diferencia de los índices indexados numéricamente, las matrices asociativas deben declararse antes de poder usarse.

Para declarar una matriz asociativa, use la declare incorporada con la opción -A (mayúscula):

declare -A array_name

Las matrices asociativas se crean utilizando el siguiente formulario:

declare -A array_name

 array_name[index_foo]=value_foo
 array_name[index_bar]=value_bar
 array_name[index_xyz]=value_xyz

Donde index_* puede ser cualquier cadena.

También puede crear una matriz asociativa usando el siguiente formulario:

declare -A array_name

 array_name=(
 [index_foo]=value_foo
 [index_bar]=value_bar
 [index_xyz]=value_xyz
 )

Operaciones de matriz

Si eres nuevo en la programación Bash, las matrices en Bash pueden resultar confusas al principio. Sin embargo, después de leer este artículo, los entenderás mejor.

Elementos de referencia

Para hacer referencia a un solo elemento, necesita conocer el índice del elemento.

Puede hacer referencia a cualquier elemento utilizando la siguiente sintaxis:

${array_name[index]}

La sintaxis para acceder a un elemento de matriz es similar a la sintaxis de la mayoría de los lenguajes de programación. Las llaves ${} son necesarias para evitar los operadores de expansión de nombres de archivos del shell.

Imprimimos el elemento con un índice de 1:

## declare the array
 declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## print element
 echo ${my_array[1]}
Helium

Si usa @ o * como índice, la palabra se expande a todos los miembros de la matriz.

Para imprimir todos los elementos, debe utilizar:

## declare the array
 declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## print all elements
 echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium

La única diferencia entre @ y * es cuando el formulario ${my_array[x]} está entre comillas dobles. En este caso, * se expande a una sola palabra donde los elementos de la matriz están separados por un espacio. @ expande cada elemento de la matriz en una palabra separada. Esto es especialmente importante cuando se utiliza la forma analfabeta a través de elementos de matriz.

Para imprimir las claves de la matriz, agregue ! operador antes del nombre de la matriz:

${!array_name[index]}

Aquí hay un ejemplo:

## declare the array
 declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## print all elements
 echo "${!my_array[@]}"
0 1 2 3

Longitud de la matriz

Si desea determinar la cantidad de elementos en una matriz, puede usar la siguiente sintaxis para obtener la longitud de la matriz:

${#array_name[@]}

La sintaxis es la misma que cuando se hace referencia a todos los elementos agregando el carácter # antes del nombre de la matriz.

## declare the array
 declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## array Length
 echo ${#my_array[@]}
4

Pasar por la matriz

Cuando tienes un conjunto de elementos, a menudo necesitas realizar una operación en cada elemento. Una forma de lograr esto es iterar sobre la matriz mediante un bucle. El bucle for le permite acceder a cada elemento de la matriz individualmente y realizar la operación deseada en él.

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## Array Loop
 for i in "${my_array[@]}"
 do
 echo "$i"
 done

El código anterior iterará sobre la matriz e imprimirá cada elemento en una nueva línea:

Hydrogen
 Helium
 Lithium
 Beryllium

A continuación se muestra un ejemplo de cómo imprimir todas las claves y valores:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## Array Loop
 for i in "${!my_array[@]}"
 do
 echo "$i" "${my_array[$i]}"
 done
0 Hydrogen
 1 Helium
 2 Lithium
 3 Beryllium

Otra forma de iterar a través de una matriz es obtener la longitud de la matriz y usar el bucle C-style:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 # Length of the array
 length=${#my_array[@]}

 # Array Loop
 for (( i=0; i < ${length}; i++ ))
 do
 echo $i ${my_array[$i]}
 done
0 Hydrogen
 1 Helium
 2 Lithium
 3 Beryllium

Agregar un nuevo elemento

Para agregar un nuevo elemento a una matriz bash y especificar su índice, use el siguiente formulario:

my_array[index_n]="New Element"

Aquí hay un ejemplo:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## add new element
 my_array[9]="Aluminum"

 ## print all elements
 echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Aluminum

Otra forma de agregar un nuevo elemento a una matriz sin especificar el índice es usar el operador +=. Puedes agregar uno o más elementos:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## add new elements
 my_array+=( Cobalt Nickel )

 ## print all elements
 echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Cobalt Nickel

Eliminar un elemento

Para eliminar un solo elemento, necesitará conocer el índice del elemento. Se puede eliminar un elemento usando el comando unset:

unset my_array[index]

Veamos un ejemplo:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

 ## remove element
 unset my_array[2]

 ## print all elements
 echo "${my_array[@]}"
Hydrogen Helium Beryllium

Conclusión

Hemos explicado cómo crear matrices asociativas y indexadas numéricamente. También mostramos cómo iterar a través de matrices, calcular la longitud de la matriz y agregar y eliminar elementos.

Si tiene alguna pregunta o comentario, no dude en dejar un comentario.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.