Introducción
Los bucles son uno de los conceptos fundamentales de los lenguajes de programación. Los bucles son útiles cuando desea ejecutar repetidamente una serie de comandos hasta que se cumpla una determinada condición.
En lenguajes de secuencias de comandos como Bash, los bucles son útiles para automatizar tareas repetitivas.
Hay tres construcciones básicas de bucle en los scripts Bash, bucle for, bucle while y bucle hasta que.
En este tutorial, cubriremos los conceptos básicos del bucle for en Bash. También le mostraremos cómo usar las declaraciones break y continue para cambiar el flujo de un bucle.
Sintaxis
El bucle for recorre una lista de elementos y ejecuta el conjunto de comandos especificado.
El bucle Bash for tiene la siguiente forma:
for item in [LIST]
do
[COMMANDS]
done
La lista puede ser una serie de cadenas separadas por espacios, un rango de números, la salida de un comando, una matriz, etc.
Pasa por las cuerdas
En el siguiente ejemplo, el bucle repetirá cada elemento en la lista de cadenas y la element
se establecerá en el elemento actual.
for element in Hydrogen Helium Lithium Beryllium
do
echo "Element: $element"
done
El bucle producirá la siguiente salida:
Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium
Desplazarse por un rango de números
Puede utilizar la expresión de secuencia para especificar un rango de números o caracteres definiendo un punto inicial y final para el rango. La expresión toma la siguiente forma:
{START..END}
En el siguiente ejemplo, el ciclo repetirá todos los números del 0 al 3.
for i in {0..3}
do
echo "Number: $i"
done
Number: 0
Number: 1
Number: 2
Number: 3
A partir de Bash 4, también es posible especificar un incremento cuando se utilizan rangos. La expresión toma la siguiente forma:
{START..END..INCREMENT}
for i in {0..20..5}
do
echo "Number: $i"
done
Number: 0
Number: 5
Number: 10
Number: 15
Number: 20
Repasa los elementos de la matriz.
También puede usar el bucle for para iterar sobre una matriz de elementos:
En el siguiente ejemplo, definimos una BOOKS
y repetimos cada elemento de la matriz.
BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')
for book in "${BOOKS[@]}"; do
echo "Book: $book"
done
Book: In Search of Lost Time
Book: Don Quixote
Book: Ulysses
Book: The Great Gatsby
Bash para Loop C-Style
La sintaxis de estilo C tiene la siguiente forma:
for ((INITIALIZATION; TEST; STEP))
do
[COMMANDS]
done
La INITIALIZATION
se reproduce solo una vez cuando comienza el bucle. Luego, se evalúa la parte TEST
Si es falso, el ciclo for ha terminado. Si el TEST
es verdadero, se ejecutan los comandos dentro del cuerpo del bucle for y se actualiza la parte STEP
En el siguiente código, el ciclo comienza inicializando i = 0
, por lo que antes de cada iteración verifica si i ≤ 10
. Si es verdadero, imprima el valor actual de i
y [variable de incremento] i
en 1 ( i++
); de lo contrario, el ciclo termina.
for ((i = 0 ; i <= 1000 ; i++)); do
echo "Counter: $i"
done
El bucle se repetirá 1001 veces y producirá la siguiente salida:
Counter: 0
Counter: 1
Counter: 2...
Counter: 998
Counter: 999
Counter: 1000
Declaraciones de romper y continuar
Las sentencias break y continue se pueden utilizar para controlar la ejecución del bucle for.
Declaración de ruptura
La sentencia break finaliza el ciclo actual y pasa el control del programa a la sentencia que sigue a la sentencia terminada. Por lo general, se usa para terminar el ciclo cuando se cumple una determinada condición.
En el siguiente ejemplo, usamos la instrucción if para terminar la ejecución del ciclo una vez que el elemento iterado actual es igual a "Lithium".
for element in Hydrogen Helium Lithium Beryllium; do
if [[ "$element" == 'Lithium' ]]; then
break
fi
echo "Element: $element"
done
echo 'All Done!'
Element: Hydrogen
Element: Helium
All Done!
Declaración continuada
La instrucción continue sale de la iteración actual de un ciclo y pasa el control del programa a la siguiente iteración del ciclo.
En el siguiente ejemplo, estamos iterando a través de un rango de números y cuando el elemento iterado actual es igual a '2', la instrucción continue devolverá la ejecución al inicio del ciclo y continuará con la siguiente iteración.
for i in {1..5}; do
if [[ "$i" == '2' ]]; then
continue
fi
echo "Number: $i"
done
Number: 1
Number: 3
Number: 4
Number: 5
Ejemplos de Bash for Loop
El siguiente ejemplo muestra cómo usar el bucle Bash for para cambiar el nombre de todos los archivos en el directorio actual con un espacio en los nombres reemplazando el espacio para el subrayado.
for file in *\ *; do
mv "$file" "${file///_}"
done
Repasemos el código línea por línea:
- La primera línea crea un bucle for y recorre una lista de todos los archivos con un espacio en su nombre. La expresión
*\ *
crea la lista. - La segunda línea se aplica a cada elemento de la lista y mueve el archivo a uno nuevo reemplazando el espacio con un guión bajo
_
. La parte${file///_}
usa la expansión de parámetros de shell para reemplazar un patrón dentro de un parámetro con una cadena. done
indica el final del segmento de bucle.
Cambiar la extensión del archivo
El siguiente ejemplo muestra cómo usar el bucle Bash for para cambiar el nombre de todos los archivos que terminan con.jpeg en el directorio actual reemplazando la extensión de archivo de.jpeg a.jpg.
for file in *.jpeg; do
mv -- "$file" "${file%.jpeg}.jpg"
done
Repasemos el código línea por línea:
- La primera línea crea un bucle for y recorre una lista de todos los archivos que terminan en '.jpeg'.
- La segunda línea se aplica a cada elemento de la lista y mueve el archivo a uno nuevo reemplazando ".jpeg" con ".jpg".
${file%.jpeg}
para eliminar la parte '.jpeg' del nombre de archivo usando la expansión de parámetros de Shell done
indica el final del segmento de bucle.
Conclusión
A estas alturas, debería tener una buena idea de cómo usar bash for loop para desplazarse por las listas.