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.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies