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.