Este artículo fue publicado originalmente en go2linux.org el 31 de marzo de 2010. El dominio ya no me pertenece, pero soy el autor original. Lo republico aquí en garron.me con correcciones y mejoras.
Introducción
Un bucle for ejecuta un bloque de comandos repetidamente, una vez por cada elemento de una lista. Es uno de los constructos más usados en scripting con bash.
Sintaxis básica
Para uso en la línea de comandos:
for NOMBRE [in PALABRAS ...]; do COMANDOS; done
En un script, distribuido en varias líneas:
for i in lista
do
comandos
done
Ejemplos
Imprimir todos los archivos del directorio actual
for i in $(ls); do echo $i; done
Por cada valor que devuelve ls, el bucle lo asigna a i y lo imprime.
Contar con un bucle for
Sintaxis estilo C
#!/bin/bash
for ((i=1; i<=25; i+=1))
do
echo $i
done
Usando expansión de llaves
#!/bin/bash
for i in {1..25}
do
echo $i
done
Contar en pasos de 5
#!/bin/bash
for i in {0..25..5}
do
echo $i
done
Salida:
0
5
10
15
20
25
Contar hacia atrás
#!/bin/bash
for i in {25..0..-5}
do
echo $i
done
Salida:
25
20
15
10
5
0
También se puede hacer con sintaxis estilo C:
#!/bin/bash
for ((i=25; i>=0; i-=5))
do
echo $i
done
break y continue
Detener el bucle con break
#!/bin/bash
for i in {1..25}
do
echo $i
if [ "$i" = "15" ]
then
break
fi
done
El bucle se detiene en cuanto i llega a 15.
Saltar una iteración con continue
#!/bin/bash
for i in {1..25}
do
if [ "$i" = "15" ]
then
continue
fi
echo $i
done
Imprime todos los números del 1 al 25 excepto el 15. Cuando i es igual a 15, continue salta a la siguiente iteración sin ejecutar el echo.
Iterar sobre archivos
Un uso habitual es procesar un conjunto de archivos:
#!/bin/bash
for f in /var/log/*.log
do
echo "Procesando $f"
gzip "$f"
done
Iterar sobre la salida de un comando
#!/bin/bash
for usuario in $(cut -d: -f1 /etc/passwd)
do
echo "Usuario: $usuario"
done