El bucle while en Bash es una estructura de control que permite ejecutar repetidamente un conjunto de comandos mientras se cumpla una determinada condición. Se utiliza ampliamente en automatización de procesos, lectura de archivos, manejo de entrada de usuario y evaluación de opciones en la línea de comandos.
En esta guía, aprenderás desde los conceptos básicos hasta ejemplos avanzados del bucle while en Bash, incluyendo bucles infinitos, lectura de archivos, control de entrada del usuario y más.
Sintaxis Básica del Bucle While en Bash
La sintaxis de un bucle while en Bash es la siguiente:
while [ condición ]
do
comando1
comando2
comando3
done
- El bucle continuará ejecutándose mientras la condición sea verdadera.
- La condición suele ser una expresión de comparación o el resultado de un comando.
- Si la condición nunca cambia a
false
, se generará un bucle infinito.
Sintaxis en una sola línea:
while [ condición ]; do comandos; done
Ejemplo 1: Imprimir un Mensaje Varias Veces
Este script imprimirá «Bienvenido X veces» cinco veces:
#!/bin/bash
x=1
while [ $x -le 5 ]
do
echo "Bienvenido $x veces"
x=$(( x + 1 ))
done
Equivalente en una sola línea:
x=1; while [ $x -le 5 ]; do echo "Bienvenido $x veces"; x=$(( x + 1 )); done
Ejemplo 2: Cálculo del Factorial de un Número
Este script calcula el factorial de un número dado:
#!/bin/bash
contador=$1
factorial=1
# Verificar si el usuario proporcionó un número
if [ -z "$contador" ]; then
echo "Uso: $0 <número>"
exit 1
fi
# Calcular el factorial
while [ $contador -gt 0 ]
do
factorial=$(( factorial * contador ))
contador=$(( contador - 1 ))
done
echo "Factorial: $factorial"
Uso:
$ chmod +x factorial.sh
$ ./factorial.sh 5
Ejemplo 3: Leer un Archivo Línea por Línea
Un caso de uso común del bucle while es leer un archivo línea por línea:
#!/bin/bash
ARCHIVO="$1"
if [ -z "$ARCHIVO" ]; then
echo "Uso: $0 <nombre de archivo>"
exit 1
fi
# Leer el archivo línea por línea
while IFS= read -r linea
do
echo "$linea"
done < "$ARCHIVO"
Uso:
$ chmod +x leer_archivo.sh
$ ./leer_archivo.sh miarchivo.txt
Ejemplo 4: Manejo de Opciones en la Línea de Comandos
Este ejemplo muestra cómo procesar opciones en la línea de comandos usando un bucle while y getopts
:
while getopts "ae:f:hd:s:qx:" opcion
do
case "${opcion}" in
a) ALARMA="TRUE";;
e) ADMIN=${OPTARG};;
d) DOMINIO=${OPTARG};;
f) ARCHIVO_SERVIDOR=${OPTARG};;
s) SERVIDOR_WHOIS=${OPTARG};;
q) SILENCIO="TRUE";;
x) DIAS_ADVERTENCIA=${OPTARG};;
\?) echo "Opción no válida"; exit 1;;
esac
done
Este script permite gestionar múltiples opciones con flags y argumentos.
Ejemplo 5: Manejo de Entrada del Usuario en un Bucle Infinito
Puedes usar un bucle while infinito para solicitar entrada del usuario de manera continua:
#!/bin/bash
while :
do
echo "Introduce dos números (o -1 para salir):"
read a b
if [ "$a" -eq -1 ]; then
echo "Saliendo..."
break
fi
resultado=$(( a + b ))
echo "Suma: $resultado"
done
Ejemplo 6: Bloquear Direcciones IP desde un Archivo
El siguiente script lee una lista de direcciones IP desde un archivo y las bloquea usando iptables
:
#!/bin/bash
IFS='#' # Configurar el Separador de Campos Internos a #
ARCHIVO="ips_bloqueadas.txt"
while read -r ip comentario
do
/sbin/iptables -A INPUT -s "$ip" -m comment --comment "$comentario" -j DROP
done < "$ARCHIVO"
Ejemplo de archivo (ips_bloqueadas.txt
):
192.168.1.60#BLOQUEADO:www-2
105.20.10.26#BLOQUEADO:hacker
81.2.3.6#BLOQUEADO:spam
Este script procesa el archivo y aplica reglas de firewall en iptables
.
Ejemplo 7: Salir de un Bucle con break
El comando break
termina un bucle cuando se cumple una condición:
#!/bin/bash
contador=1
while [ $contador -le 10 ]
do
if [ $contador -eq 5 ]; then
echo "Saliendo del bucle en $contador"
break
fi
echo "Contador: $contador"
contador=$(( contador + 1 ))
done
Salida:
Contador: 1
Contador: 2
Contador: 3
Contador: 4
Saliendo del bucle en 5
Ejemplo 8: Omitir Iteraciones con continue
El comando continue
salta la iteración actual y pasa a la siguiente:
#!/bin/bash
contador=0
while [ $contador -lt 10 ]
do
contador=$(( contador + 1 ))
if [ $(( contador % 2 )) -eq 0 ]; then
continue
fi
echo "Número impar: $contador"
done
Este script imprime solo los números impares.
Resumen: Puntos Clave
- Los bucles while ejecutan comandos mientras la condición sea verdadera.
- Usa
break
para salir del bucle antes de que termine. - Usa
continue
para saltar una iteración. - Los bucles infinitos se pueden crear con
while :
(usaCTRL+C
para detenerlos). - Los bucles while son útiles para leer archivos, manejar entrada del usuario, automatizar tareas y gestionar procesos del sistema.
Lecturas Recomendadas
Si deseas profundizar en el scripting en Bash, revisa estos recursos:
- Guía de Bash Scripting
- Ejemplos de Bucles en Bash
- Usa los siguientes comandos en tu terminal para acceder a documentación adicional:
man bash
help while
help {
help break
help [
help continue