Introducción
Los bucles son uno de los conceptos fundamentales de los lenguajes de programación. Los bucles son útiles cuando desea ejecutar una serie de comandos varias veces 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 3 construcciones básicas de bucle en los scripts Bash, bucle for, bucle while y bucle hasta que.
Este tutorial explica los conceptos básicos de los bucles while en Bash y las declaraciones break y continue para cambiar el flujo de un bucle.
Bash While Loop
El ciclo while se usa para ejecutar un conjunto de comandos dado un número desconocido de veces, siempre que la condición especificada sea verdadera.
El bucle Bash while tiene la siguiente forma:
while [CONDITION]
do
[COMMANDS]
done
La condición se evalúa antes de ejecutar los comandos. Si la condición se evalúa como verdadera, se ejecutan los comandos. De lo contrario, si la condición se evalúa como falsa, el ciclo se terminará y el control del programa se pasará al siguiente comando.
En el siguiente ejemplo, en cada iteración, el ciclo imprime el valor actual de la variable i
aumenta la variable en uno.
i=0
while [ $i -le 2 ]
do
echo Number: $i
((i++))
done
El ciclo de repetición continúa hasta que i
es menor o igual a dos. Producirá la siguiente salida:
Number: 0
Number: 1
Number: 2
Mientras que el bucle es infinito
Un ciclo infinito es un ciclo que se repite indefinidamente y nunca termina. Si la condición siempre se evalúa como verdadera, se obtiene un bucle infinito.
En el siguiente ejemplo, estamos usando el comando incorporado :
que siempre devuelve verdadero para crear un bucle infinito. También puede usar el true
o cualquier otra declaración que siempre devuelva true.
while:
do
echo "Press <CTRL+C> to exit."
sleep 1
done
El ciclo while anterior funcionará indefinidamente. Puede finalizar el ciclo presionando CTRL+C
Aquí hay un equivalente de una sola línea:
while:; do echo 'Press <CTRL+C> to exit.'; sleep 1; done
Leer un archivo línea por línea
Uno de los usos más comunes del bucle while es leer un archivo, flujo de datos o variable línea por línea.
En el siguiente ejemplo, el ciclo while leerá el /etc/passwd
línea por línea e imprimirá cada línea.
file=/etc/passwd
while read -r line; do
echo $line
done < "$file"
En lugar de verificar el ciclo while con una condición, estamos usando la redirección de entrada < "$file"
para pasar un archivo a la read
que es el comando que verifica el ciclo. El ciclo while se ejecutará hasta que se lea la última línea.
Al leer el archivo línea por línea, siempre use read
con la -r
para evitar que la barra invertida sea un carácter de escape.
De forma predeterminada, el read
corta los espacios en blanco iniciales /finales (espacios y tabulaciones). Utilice la IFS=
antes del read
para evitar este comportamiento
file=/etc/passwd
while IFS= read -r line; do
echo $line
done < "$file"
Declaraciones de romper y continuar
Las sentencias break y continue se pueden usar para controlar la ejecución del ciclo while.
Declaración de ruptura
La sentencia break termina el ciclo actual y pasa el control del programa al comando que sigue al ciclo terminado. Por lo general, se usa para terminar el ciclo cuando se cumple una determinada condición.
En el siguiente ejemplo, la ejecución del bucle se detendrá cuando el elemento iterado actual sea igual a 2
.
i=0
while [ $i -lt 5 ]
do
echo "Number: $i"
((i++))
if [[ "$i" == '2' ]]; then
break
fi
done
echo 'All Done!'
Number: 0
Number: 1
All Done!
Continuar declaración
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.
A partir de entonces, una vez que el elemento iterado actual sea igual a 2
, la declaración de continuación le permitirá volver al principio del ciclo y continuar con la siguiente iteración.
i=0
while [ $i -lt 5 ]
do
((i++))
if [[ "$i" == '2' ]]; then
continue
fi
echo "Number: $i"
done
echo 'All Done!'
Number: 1
Number: 3
Number: 4
Number: 5
All Done!
Conclusión
A estas alturas ya debería tener un buen conocimiento de cómo utilizar el bucle while de bash.