Cómo usar matrices en scripts Bash en Linux

1 mar 2021 4 min di lettura
Cómo usar matrices en scripts Bash en Linux
Indice dei contenuti

Introducción

Las matrices son una de las estructuras de datos fundamentales y más utilizadas. Puede pensar que una matriz es una variable que puede almacenar múltiples variables en ella.

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

Matrices Bash

Bash admite tipos de matrices asociativas e indexadas numéricamente unidimensionales. Las matrices numéricas se referencian mediante números enteros y las asociaciones se referencian mediante cadenas.

Las matrices indexadas numéricamente son accesibles desde el final utilizando índices negativos, el índice de -1 es una referencia del último elemento. No es necesario que los índices sean 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. Puede crear una matriz que contenga tanto cadenas como 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 el número máximo de elementos que se pueden almacenar en una matriz.

Las matrices en Bash se pueden inicializar de varias formas.

Cree matrices indexadas numéricamente

Las variables de bash no se escriben, cualquier variable se puede usar como una matriz indexada sin declararla.

Para declarar explícitamente una matriz, use la función de declare

declare -a array_name

Una forma de crear una matriz indexada es mediante 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 corchetes, separados por espacios en blanco:

array_name=( element_1 element_2 element_N )

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

Crea matrices asociativas

A diferencia de la indexación numérica, las matrices asociativas deben declararse antes de que puedan usarse.

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

declare -A array_name

Las matrices asociativas se pueden crear utilizando el siguiente módulo:

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 utilizando el siguiente formulario:

declare -A array_name

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

Operaciones de matriz

La sintaxis de las matrices Bash puede parecer un poco extraña al principio, pero tendrá más sentido una vez que lea este artículo.

Elementos de referencia

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

Se puede hacer referencia a cualquier elemento utilizando la siguiente sintaxis:

${array_name[index]}
${}

Imprimimos el elemento con í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 debes usar:

## 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 módulo ${my_array[x]} está entre comillas dobles. En este caso, * 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 usa el módulo para analizar elementos de matriz.

Para imprimir las claves de matriz, agregue el 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 matrices

Para obtener la longitud de una matriz, use el siguiente formulario:

${#array_name[@]}

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

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

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

Ir a través de la matriz

La forma más común de iterar sobre cada elemento de una matriz es usar el ciclo for:

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

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

El código anterior repetirá 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 hacer un bucle en una matriz es obtener la longitud de la matriz y usar el bucle de 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 artículo nuevo

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 += Puede 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, necesita conocer el índice de elementos. Un elemento se puede eliminar 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

Explicamos cómo crear matrices asociativas e 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.

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.