GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Beginner Series #4:Uso de arreglos en Bash

¡Arreglos al rescate!

Hasta ahora, ha utilizado un número limitado de variables en su script bash, ha creado algunas variables para contener uno o dos nombres de archivo y nombres de usuario.

Pero, ¿qué sucede si necesita más de unas pocas variables en sus scripts de bash? digamos que desea crear un script bash que lea cien entradas diferentes de un usuario, ¿va a crear 100 variables?

Afortunadamente, no es necesario porque las matrices ofrecen una solución mucho mejor.

Creando su primera matriz en un script bash

Supongamos que desea crear un script bash timestamp.sh que actualiza la marca de tiempo de cinco archivos diferentes.

Primero, use el enfoque ingenuo de usar cinco variables diferentes:

#!/bin/bash

file1="f1.txt"
file2="f2.txt"
file3="f3.txt"
file4="f4.txt"
file5="f5.txt"

touch $file1
touch $file2
touch $file3
touch $file4
touch $file5

Ahora, en lugar de usar cinco variables para almacenar el valor de los cinco nombres de archivo, crea una matriz que contiene todos los nombres de archivo, aquí está la sintaxis general de una matriz en bash:

array_name=(value1 value2 value3 … )

Así que ahora puede crear una matriz llamada archivos que almacene los cinco nombres de archivo que ha usado en timestamp.sh guión de la siguiente manera:

files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")

Como puede ver, esto es mucho más limpio y eficiente ya que ha reemplazado cinco variables con una sola matriz.

Acceder a elementos de matriz en bash

El primer elemento de una matriz comienza en el índice 0 y así, para acceder al enésimo elemento de la matriz, usa el n -1 índice.

Por ejemplo, para imprimir el valor del elemento 2 de su matriz de archivos, puede usar la siguiente declaración de eco:

echo ${files[1]}

y para imprimir el valor del elemento 3 de su matriz de archivos, puede usar:

echo ${files[2]}

y así sucesivamente.

El siguiente script bash reverse.sh imprimiría los cinco valores en su matriz de archivos en orden inverso, comenzando con el último elemento de la matriz:

#!/bin/bash

files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")

echo ${files[4]}
echo ${files[3]}
echo ${files[2]}
echo ${files[1]}
echo ${files[0]}

Sé que te estarás preguntando por qué tantas declaraciones de eco y por qué no uso un bucle aquí. Esto se debe a que tengo la intención de presentar los conceptos de bash loop más adelante en esta serie .

También puede imprimir todos los elementos de la matriz a la vez:

echo ${files[*]}

f1.txt f2.txt f3.txt f4.txt f5.txt

Puede imprimir el número total de elementos de la matriz de archivos, es decir, el tamaño de la matriz :

echo ${#files[@]}

5

También puede actualizar el valor de cualquier elemento de una matriz; por ejemplo, puede cambiar el valor del primer elemento de la matriz de archivos a "a.txt" usando la siguiente asignación:

files[0]="a.txt"

Agregar elementos de matriz en bash

Vamos a crear una matriz que contenga el nombre de las distribuciones populares de Linux:

distros=("Ubuntu" "Red Hat" "Fedora")

La matriz de distribuciones actual contiene tres elementos. Puede usar el += operador para agregar (agregar) un elemento al final de la matriz.

Por ejemplo, puede agregar Kali a la matriz de distribuciones de la siguiente manera:

distros+=("Kali")

Ahora la matriz de distribuciones contiene exactamente cuatro elementos de la matriz, siendo Kali el último elemento de la matriz.

Eliminar elementos de matriz en bash

Primero creemos una matriz numérica que almacenará los números del 1 al 5:

num=(1 2 3 4 5)

Puede imprimir todos los valores en la matriz numérica:

echo ${num[*]}

1 2 3 4 5

Puede eliminar el elemento 3 de la matriz numérica utilizando unset shell integrado:

unset num[2]

Ahora, si imprime todos los valores de la matriz numérica:

echo ${num[*]}
1 2 4 5

Como puede ver, el tercer elemento de la matriz num ha sido eliminado.

También puede eliminar toda la matriz numérica de la misma manera:

unset num

Creando matrices híbridas con diferentes tipos de datos

En bash, a diferencia de muchos otros lenguajes de programación, puede crear una matriz que contenga diferentes tipos de datos. Eche un vistazo al siguiente user.sh secuencia de comandos bash:

#!/bin/bash

user=("john" 122 "sudo,developers" "bash")

echo "User Name: ${user[0]}"
echo "User ID: ${user[1]}"
echo "User Groups: ${user[2]}"
echo "User Shell: ${user[3]}"

Observe que la matriz de usuario contiene cuatro elementos:

  1. "John" ----> Tipo de datos de cadena
  2. 122 --->  Tipo de datos enteros
  3. "sudo,desarrolladores" ---> Tipo de datos de cadena
  4. "bash" --->  Tipo de datos de cadena

Por lo tanto, está totalmente bien almacenar diferentes tipos de datos en la misma matriz. ¿No es increíble?

Esto nos lleva al final de este tutorial; ¡Espero que lo hayan disfrutado! Si desea algo más complicado y un ejemplo del mundo real, consulte cómo dividir cadenas en bash usando matrices.

Y, por supuesto, puede practicar lo que acaba de aprender resolviendo los problemas y consultar sus soluciones si se atasca o necesita una pista.

Bash Chapter 4 Practice QuestionsProblems y su solución para practicar Bash arraysBash-Chapter-4-Practice-Questions-Linux-Handbook.pdf29 KB

En el próximo capítulo, le mostraré cómo usar varios operadores aritméticos bash.

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

  2. ¿Usando una referencia a una variable de cadena Bash en Sed?

  3. Bash Beginner Series #9:Uso de funciones en Bash

  4. Bash Beginner Series #8:Bucles en Bash

  5. Elimine los espacios en blanco en cada comienzo de línea del archivo, usando bash

Bash Beginner Series #1:Cree y ejecute su primer script de Bash Shell

Bash Beginner Series #5:Uso de operadores aritméticos en Bash Scripting

Bash Beginner Series #3:Pasando Argumentos a Bash Scripts

Bash Beginner Series #7:Toma de decisiones con sentencias If Else y Case

Bash Beginner Series #6:Operaciones de cadenas en Bash

Bash Beginner Series #10:Automatización con Bash