Las matrices son una de las estructuras de datos más utilizadas y fundamentales. Puede pensar que una matriz es una variable que puede almacenar múltiples variables dentro de ella.
En este artículo, cubriremos las matrices de Bash y explicaremos cómo usarlas en sus scripts de Bash.
Arreglos Bash #
Bash admite tipos de arreglos unidimensionales indexados numéricamente y asociativos. Las matrices numéricas se referencian mediante números enteros y las asociativas mediante cadenas.
Se puede acceder a las matrices indexadas numéricamente desde el final usando í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. Puede crear una matriz que contenga cadenas y números.
Bash no admite matrices multidimensionales y no puede tener elementos de matriz que también sean matrices.
No hay límite en el número máximo de elementos que se pueden almacenar en una matriz.
Creación de matrices Bash #
Los arreglos en Bash se pueden inicializar de diferentes maneras.
Creando matrices indexadas numéricamente #
Las variables de Bash no tienen tipo, cualquier variable se puede usar como una matriz indexada sin declararla.
Para declarar explícitamente una matriz, use la declaración interna:
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 entero positivo.
Otra forma de crear una matriz numérica es especificar la lista de elementos entre paréntesis, separados por un espacio vacío:
array_name=( element_1 element_2 element_N )
Cuando la matriz se crea utilizando el formulario anterior, la indexación comienza en cero, es decir, el primer elemento tiene un índice de 0
.
Creando matrices asociativas #
A diferencia de los índices numéricos, las matrices asociativas deben declararse antes de que puedan usarse.
Para declarar una matriz asociativa, use declare
integrado con el -A
(mayúsculas) opción:
declare -A array_name
Las matrices asociativas se pueden crear 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 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 usando 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 necesarios para evitar los operadores de expansión de nombre de archivo de shell.
Imprimamos 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 que usaría:
## 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 la forma ${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 espacios. @
expande cada elemento de la matriz a una palabra separada. Esto es especialmente importante cuando se usa el formulario para analfabetar a través de elementos de matriz.
Para imprimir las claves de la 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 la matriz #
Para obtener la longitud de una matriz, utilice el siguiente formulario:
${#array_name[@]}
La sintaxis es la misma que cuando se hace referencia a todos los elementos con la adición de #
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
Recorra la matriz #
La forma más común de iterar sobre cada elemento de una matriz es mediante el bucle for:
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
Aquí hay 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 recorrer una matriz es obtener la longitud de la matriz y usar el C style
bucle:
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 usando +=
operador. Puede agregar uno o varios 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. Un elemento se puede eliminar usando unset
comando:
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 e indexadas numéricamente. También mostramos cómo iterar a través de las matrices, calcular la longitud de la matriz y agregar y eliminar elementos.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.