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