GNU/Linux >> Tutoriales Linux >  >> Linux

Arreglos bash

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.


Linux
  1. ¿Cómo crear una matriz de elementos únicos a partir de una cadena/matriz en Bash?

  2. Bash Matriz de matrices?

  3. Obtener todos los archivos excepto los archivos en matriz:¿Bash?

  4. El último tutorial de Bash Array con 15 ejemplos

  5. Matriz en Bash no encontrada

Bash Shebang

Matriz asociativa en Bash

Bash Scripting:matriz asociativa explicada con ejemplos

Bash Beginner Series #4:Uso de arreglos en Bash

Comportamiento de Arrays en bash scripting y zsh shell (¿Índice de inicio 0 o 1?)

cómo cambiar el valor de la matriz en bash