Bash Script – DÍA 3

Bucles y automatización: for, while, until + procesar archivos línea a línea


1. Objetivo del día

Aprender a repetir tareas de forma automática:

  • for → recorrer listas, rangos y resultados de comandos
  • while → ejecutar mientras una condición se cumpla
  • until → ejecutar hasta que algo ocurra
  • leer archivos línea a línea (fundamental para sysadmins)
  • automatizar tareas repetitivas

Este es uno de los días más prácticos del curso.


2. Requisitos

  • Saber condicionales (Día 2)
  • Saber ejecutar scripts (Día 1)

3. Bucles for

El for es perfecto para recorrer listas de valores.


3.1. Recorrer una lista fija

for animal in perro gato caballo; do
    echo "Animal: $animal"
done

3.2. Recorrer números

for i in {1..5}; do
    echo "Número: $i"
done

3.3. Recorrer resultados de un comando

Ejemplo: listar archivos del directorio actual:

for archivo in $(ls); do
    echo "Archivo: $archivo"
done

Ejemplo real: mostrar procesos relacionados con ssh:

for pid in $(pgrep ssh); do
    echo "Proceso SSH: $pid"
done

¿Qué hace pgrep?

pgrep busca procesos por nombre y devuelve sus PID (identificadores de proceso).
Cada PID se devuelve en una línea distinta, por ejemplo:

1234
5678
9012

4. Bucle while

Ejecuta mientras una condición sea verdadera.


4.1. Contador simple

contador=1

while [ $contador -le 5 ]; do
    echo "Cuenta: $contador"
    contador=$((contador + 1))
done

4.2. Esperar hasta que un servicio responda

Ejemplo profesional:

while ! ping -c 1 servidor >/dev/null 2>&1; do
    echo "Esperando a que el servidor responda..."
    sleep 2
done

echo "El servidor está activo"

5. Bucle until

Hace lo contrario: ejecuta hasta que algo ocurra.


5.1. Ejemplo simple

contador=1

until [ $contador -gt 5 ]; do
    echo "Cuenta: $contador"
    contador=$((contador + 1))
done

6. Leer un archivo línea a línea (SUPER IMPORTANTE)

Esto es esencial para:

  • probar conectividad a una lista de servidores
  • hacer ping a varias IP
  • procesar tareas en lote
  • comprobaciones de health-check
  • automatizar tareas repetitivas

Forma profesional:

while IFS= read -r linea; do
    echo "Procesando: $linea"
done < archivo.txt

🔹 IFS= evita romper líneas por espacios
🔹 -r evita interpretar caracteres especiales

¿Por qué usamos esta forma profesional?

while IFS= read -r linea; do
    echo "Procesando: $linea"
done < archivo.txt

✔ IFS=
Deja vacío el separador interno de campos.
Así, no se cortan las líneas cuando contienen espacios, tabuladores o caracteres raros.
Ejemplo:
"Servidor Principal 01" se lee completo, no como tres palabras.

✔ read -r
Indica a read que no interprete las barras invertidas (\).
Esto evita sorpresas si la línea tiene rutas tipo /var/log/ o caracteres como \t, \n, etc.

✔ done < archivo
El archivo se pasa al bucle sin usar tuberías, evitando subshells y asegurando que las variables creadas dentro del while se mantienen.

En resumen:
Esta combinación es la forma más segura, robusta y portable de leer archivos línea a línea en Bash. Ideal tanto para principiantes como para scripts profesionales.


6.1. EJEMPLO REAL: Comprobar si servidores responden al ping

Archivo servidores.txt:

srv01
srv02
8.8.8.8
google.com

Script:

#!/bin/bash

while IFS= read -r srv; do
    echo "Probando $srv"
    if ping -c 1 "$srv" >/dev/null 2>&1; then
        echo "$srv responde"
    else
        echo "$srv NO responde"
    fi
    echo "--------------"
done < servidores.txt

Esto es EXACTAMENTE lo que usa un sysadmin en la vida real.


6.2. EJEMPLO REAL: Verificar resolución DNS

#!/bin/bash

while IFS= read -r host; do
    echo "Resolviendo $host"
    if nslookup "$host" >/dev/null 2>&1; then
        echo "OK"
    else
        echo "FALLO"
    fi
done < hosts.txt

6.3. EJEMPLO REAL: Verificar si un puerto está abierto

#!/bin/bash

while IFS= read -r host; do
    echo -n "Probando $host:443... "
    if nc -z "$host" 443 >/dev/null 2>&1; then
        echo "ABIERTO"
    else
        echo "CERRADO"
    fi
done < lista_hosts.txt

7. Práctica guiada (20–30 minutos)

7.1. Crear archivo con una lista de cosas

echo -e "uno\ndos\ntres" > lista.txt

7.2. Crear script que recorra esta lista

nano recorrer.sh

Poner:

#!/bin/bash

while IFS= read -r item; do
    echo "Item: $item"
done < lista.txt

7.3. Crear script que haga 5 pings a google

for i in {1..5}; do
    ping -c 1 google.com
done

7.4. (Opcional recomendado) Pasar un archivo como parámetro y procesarlo

En este ejercicio unimos:

  • parámetros ($1)
  • lectura línea a línea
  • bucle while
  • uso de un comando real (ping)

1) Crear archivo de servidores

echo -e "google.com\n1.1.1.1\n8.8.8.8" > servidores.txt

2) Crear el script ping_lista.sh

nano ping_lista.sh

Contenido:

#!/bin/bash

# Comprobar que el usuario pasa un argumento
if [ -z "$1" ]; then
    echo "Uso: $0 archivo_de_servidores.txt"
    exit 1
fi

fichero="$1"

# Leer el archivo línea a línea
while IFS= read -r server; do
    echo "Haciendo ping a: $server"
    ping -c 1 "$server"
    echo "----------------------"
done < "$fichero"

3) Ejecutar el script

bash ping_lista.sh servidores.txt

8. Checklist del Día 3

  • Usas bucles for con listas
  • Usas bucles for con rangos {1..N}
  • Usas while para repetir acciones
  • Sabes cuándo usar until
  • Lees archivos línea a línea
  • Procesas listas de servidores o IPs
  • Puedes automatizar tareas repetitivas

Si marcas todo → Día 3 superado.


9. Ejercicio sugerido

Crea un script llamado:

healthcheck.sh

Que:

  1. Lea un archivo servidores.txt
  2. Para cada servidor:
    • ping
    • nslookup
    • comprobar puerto 443 con nc
  3. Muestre un informe como:
srv01: ping OK, dns OK, puerto OK
srv02: ping FAIL, dns OK, puerto FAIL

Esto será la base del proyecto final.


10. Día 3 completado

Aquí es donde Bash empieza a brillar:
Ya sabes automatizar repeticiones y procesar listas completas.

Mañana seguimos con:

👉 Día 4 – Argumentos y parámetros especiales ($1, $#, «$@», shift)
Es el día que permite hacer scripts REUTILIZABLES y pasarles datos desde fuera.