Bucles con For y While

ShellBeginner
Practicar Ahora

Introducción

Imagine que tiene que firmar 1.000 cartas. Firmar una es fácil. Firmar 1.000 resulta aburrido y le duele la mano. En programación, evitamos las repeticiones aburridas.

Para resolver este problema usamos bucles. Un bucle permite indicarle al equipo: haga esto repetidamente, ya sea para cada elemento de una lista o hasta que cambie una condición.

Los bucles son fundamentales para la automatización porque los equipos son buenos repitiendo tareas y las personas no tanto. Si se descubre ejecutando una y otra vez el mismo patrón de comandos, normalmente es una señal de que debería usar un bucle.

En este laboratorio construirá sus propias líneas de ensamblaje digitales:

  1. El contador: un bucle que cuenta por usted (el bucle for).
  2. El trabajador: un bucle que procesa cada archivo de un conjunto (el bucle for con archivos).
  3. El vigilante: un bucle que sigue trabajando hasta que se alcanza un objetivo (el bucle while).

El bucle de números (bucle For)

El bucle for funciona como una lista de tareas. Tiene una lista de elementos y realiza una acción para cada elemento de la lista.

Este es uno de los patrones de automatización más útiles en los sistemas Unix y similares. Los equipos son muy buenos repitiendo una acción pequeña de forma constante, por lo que los bucles permiten convertir una tarea para un solo elemento en una tarea para muchos elementos sin copiar el mismo comando una y otra vez.

Comencemos con la lista más sencilla: los números. Pediremos al equipo que cuente del 1 al 5.

Primero, compruebe su espacio de trabajo:

cd ~/project

Cree un script llamado num_loop.sh:

nano num_loop.sh

Escriba este código:

#!/bin/bash

for i in {1..5}; do
  echo "Number: $i"
done

Descifrado de la línea de ensamblaje:

  • for i in {1..5}: es el alimentador de la máquina. Toma los números 1, 2, 3, 4 y 5, y los introduce uno por uno en la variable $i.
  • do: inicia la máquina.
  • echo ...: es la tarea específica que se debe realizar.
  • done: detiene la máquina para este elemento y vuelve a buscar el siguiente.

La parte {1..5} es una abreviatura de Bash llamada expansión de llaves. Antes de que comience el bucle, Bash la expande en una lista de valores. Por tanto, el bucle recorre una lista preparada, un elemento a la vez.

Guarde el archivo (Ctrl+O) y salga (Ctrl+X).

Haga que el script sea ejecutable:

chmod +x num_loop.sh
./num_loop.sh

Verá al robot contar:

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

El bucle de archivos (bucle For)

Contar es divertido, pero procesar archivos resulta útil. El bucle for es especialmente potente cuando se combina con comodines, como *.txt. Puede indicarle al script: «Para cada archivo de texto que encuentre en esta carpeta, haga X».

Ya hemos creado algunos archivos de texto de ejemplo en su carpeta. Escribamos un script para encontrarlos.

Cree un archivo nuevo llamado file_loop.sh:

nano file_loop.sh

Escriba este código:

#!/bin/bash

echo "Listing text files:"
for file in *.txt; do
  echo "Found file: $file"
done

La lógica:

En lugar de los números {1..5}, proporcionamos al bucle el patrón *.txt.

Bash examina la carpeta, encuentra todos los archivos coincidentes, como data1.txt y notes.txt, y los introduce uno por uno en la variable llamada $file.

Este paso de coincidencia ocurre antes de que se ejecute el cuerpo del bucle. El shell expande *.txt en una lista de nombres de archivo y, después, el bucle for recorre esa lista. Por eso los bucles y los patrones glob funcionan tan bien juntos en los scripts de shell.

Guarde el archivo y salga.

Ejecute el script:

chmod +x file_loop.sh
./file_loop.sh

Salida:

Listing text files:
Found file: data1.txt
Found file: data2.txt
Found file: notes.txt

Imagine que, en lugar de usar solo echo, utilizara mv para mover los archivos o zip para archivarlos. ¡Podría procesar 10.000 archivos en segundos con este mismo script de cuatro líneas!

El bucle condicional (bucle While)

El bucle for es excelente cuando tiene una lista de números o archivos. Pero ¿qué ocurre si no tiene una lista? ¿Qué ocurre si solo quiere «seguir trabajando HASTA que suceda algo»?

Esa es la función del bucle While. Es como un termostato: «Mientras la habitación esté fría, mantenga encendida la calefacción».

Escribamos un script que cuente manualmente hasta 10.

Cree while_loop.sh:

nano while_loop.sh

Escriba este código:

#!/bin/bash

counter=1

while [ $counter -le 10 ]; do
  echo "Count: $counter"
  ((counter++))
done

Descifrado del termostato:

  • while [ $counter -le 10 ]: es la condición. «¿El contador es menor o igual que 10?»
    • Si la respuesta es sí: entra en el bucle.
    • Si la respuesta es no: se detiene.
  • ((counter++)): es la actualización. Añade 1 al contador. Importante: si olvida esta línea, el contador permanecerá en 1 para siempre y el script se ejecutará indefinidamente (un «bucle infinito»).

Esto destaca la diferencia principal entre for y while. Normalmente, un bucle for recibe su secuencia del shell desde el principio. Un bucle while depende de una condición que el script debe actualizar correctamente mientras se ejecuta.

La sintaxis ((counter++)) es una notación aritmética de Bash. Indica al shell que trate counter como un número y lo incremente en uno. Los scripts de shell suelen combinar el procesamiento de texto con operaciones aritméticas sencillas, por lo que esta sintaxis aparece con frecuencia.

Guarde el archivo y salga.

Ejecútelo:

chmod +x while_loop.sh
./while_loop.sh

Se comporta como el bucle for, pero la lógica es diferente. For recorre una lista. While se ejecuta en función de una condición.

Resumen

Ha construido sus primeros motores de automatización.

En este laboratorio ha aprendido a usar:

  1. La lista de tareas (for): procesa una lista definida de elementos, como los números {1..5}.
  2. El procesador por lotes (for *.txt): gestiona automáticamente cada archivo de un directorio.
  3. El termostato (while): repite acciones hasta alcanzar un objetivo o límite específico.

Estos bucles son los motores de los scripts. Transforman 1.000 clics manuales en 1 segundo de trabajo del equipo.