Pregunta 1¿Sobre qué itera for f in *.txt; do ... done?
Bucles — procesar archivos uno por uno con for
Este artículo forma parte del Curso de Linux, con el que dominarás desde cero habilidades prácticas de Linux, desde los comandos básicos hasta los scripts de shell.
Recorre una lista de archivos con for f in *.txt, repite con condición usando while [ "$i" -le 3 ] y until, salta valores vacíos con continue y detente en un límite con break — escrito y practicado en una terminal del navegador, ilustrado.
Procesar una lista en orden — for
for toma los valores que le das uno a uno y ejecuta el mismo trabajo sobre cada uno.
La forma es for v in a b c; do ... done, donde v toma a, luego b y luego c por turnos.
Lo que va entre do y done es el cuerpo que se repite.
Puedes enumerar los valores directamente, usar un patrón de archivo como *.txt o pasar la salida de $(...) de un comando.
Escribe for f in *.txt y cada archivo .txt del directorio actual entra en f por turnos, así que puedes escribir trabajo por archivo.
Usar $(...) como en for line in $(cat list.txt) te permite recorrer la salida de un comando.
Así es como escribes resúmenes de una lista de archivos o procesamiento por lotes sobre varios archivos.
for env in dev stg prod; do # procesa los valores enumerados por turnos
echo "deploying to $env"
done
for f in *.sh; do # procesa los archivos .sh por turnos
echo "script: $f"
done
for saca elementos de la lista hacia f uno a uno y ejecuta el cuerpo, luego termina en done cuando se acaban los elementos.| Syntax | Significado | Example |
|---|---|---|
for v in a b c; do … done | procesa los valores enumerados por turnos | for v in dev stg prod; do echo $v; done |
for f in *.txt; do … | procesa los archivos que coinciden por turnos | for f in *.txt; do wc -l "$f"; done |
for x in $(cmd); do … | procesa la salida de un comando por turnos | for d in $(ls); do echo $d; done |
do … done | inicio y fin del cuerpo del bucle | for v in a b; do echo $v; done |
Repetir con condición — while / until
while repite mientras la condición sea verdadera.
Como en while [ "$i" -lt 3 ]; do ... done, incrementas un contador dentro del cuerpo para acercarte al final.
until es lo contrario — repite hasta que la condición se vuelve verdadera.
Sirve para trabajo donde el número de rondas no está fijado de antemano.
i=1
while [ "$i" -le 3 ]; do # repite mientras i sea 3 o menos
echo "try $i"
i=$((i + 1))
done # try 1 / try 2 / try 3
i=1
until [ "$i" -gt 3 ]; do # repite hasta que la condición se vuelva verdadera
echo "i=$i"
i=$((i + 1))
done # i=1 / i=2 / i=3
while repite el cuerpo mientras la condición es verdadera; until lo repite hasta que la condición se vuelve verdadera. Ambos avanzan un contador en el cuerpo para acercarse al final.| Syntax | Significado | Example |
|---|---|---|
while [ cond ]; do … done | repite mientras la condición es verdadera | while [ "$i" -lt 3 ]; do …; done |
until [ cond ]; do … done | repite hasta que la condición se vuelve verdadera | until [ -f done.flag ]; do …; done |
Controlar un bucle for — break / continue
Incluso a mitad de un bucle for, puedes cambiar el flujo con break y continue.
continue salta el resto de esa ronda y pasa al siguiente elemento, mientras que break termina el bucle en sí.
Combínalos con una condición como en if [ condición ]; then continue; fi o if [ condición ]; then break; fi para saltar los elementos que no necesitas o detenerte cuando ya tienes suficiente.
for n in 1 2 3 4 5; do
if [ "$n" -eq 3 ]; then continue; fi # salta 3
if [ "$n" -eq 5 ]; then break; fi # sale en 5
echo "n=$n"
done # n=1 / n=2 / n=4
for ejecuta el cuerpo en orden desde n=1. En n=3 el continue salta el resto y sigue, y en n=5 el break termina el bucle en sí (la salida es n=1 / n=2 / n=4).| Syntax | Significado | Example |
|---|---|---|
continue | salta esta ronda y pasa a la siguiente | if [ -z "$x" ]; then continue; fi |
break | sale del bucle a mitad de camino | if [ "$n" -gt 100 ]; then break; fi |
Controlar un bucle while — break / continue
Además de la comprobación de condición en while, usar break y continue te permite detenerte antes o saltar una ronda.
continue salta esa ronda y vuelve a la comprobación de condición, mientras que break sale del bucle sin esperar a la condición.
Cuidado aquí: si no colocas la actualización del contador al inicio del cuerpo (antes de continue), la ronda saltada no lo actualizará y el bucle nunca terminará.
i=0
while [ "$i" -lt 10 ]; do
i=$((i + 1)) # avanza al inicio
if [ "$i" -eq 3 ]; then continue; fi # salta la 3ª ronda
if [ "$i" -eq 6 ]; then break; fi # sale en la 6ª ronda
echo "attempt $i"
done # attempt 1 / 2 / 4 / 5
while ejecuta el cuerpo mientras la condición es verdadera, avanzando i en 1 cada vez. En i=3 el continue vuelve a la comprobación de condición, y en i=6 el break termina el bucle sin esperar a la condición (la salida es attempt 1 / 2 / 4 / 5).| Syntax | Significado | Example |
|---|---|---|
continue | salta esta ronda, vuelve a comprobar | if [ $((i % 3)) -eq 0 ]; then continue; fi |
break | sale del bucle sin esperar a la condición | if [ "$found" -ge 4 ]; then break; fi |
| dónde actualizar el contador | actualízalo antes de continue | pon i=$((i + 1)) al inicio del cuerpo |
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué palabra clave repite mientras la condición es verdadera?
Pregunta 3¿Cuál salta solo esa ronda y pasa a la siguiente?