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.