Bucle for en Bash para Linux

Definiciones

Un bucle es un conjunto de comandos que la computadora debe repetir hasta que se cumpla una condición determinada. Puede interrumpirse antes de que se cumpla esa condición mediante un comando específico. Se usa para contar, buscar información o poblar estructuras de datos.

En informática existen dos bucles principales: el bucle for y el bucle while.

Bucle for:

En informática, un bucle for es una instrucción de un lenguaje de programación que permite ejecutar código de forma repetida. Se clasifica como una instrucción de iteración. A diferencia de otros tipos de bucles, como el while, el for se distingue por tener un contador o variable de bucle explícita.

Bucle while:

En la mayoría de los lenguajes de programación, un bucle while es una instrucción de control de flujo que permite ejecutar código de forma repetida basándose en una condición booleana. Se puede pensar en él como un if que se repite.

Con eso claro, comencemos con el artículo sobre el bucle for en Bash.

Cómo usar el bucle for en Bash

En Bash hay dos formas de implementar un bucle for:

  1. Indicarle a for que actúe sobre una lista predefinida de elementos, con la instrucción for … in.
  2. Usar la sintaxis de C: for (( exp1, exp2, exp3 )).

Ejemplos simples de cada forma:

Usando la instrucción for ... in

for i in 1 2 3 4
do
    echo "Número $i"
done

Usando la instrucción for ((exp1, exp2, exp3))

for (( i=1; i<=4; i++))
do
    echo "Número $i"
done

El resultado es el mismo en ambos casos:

Número 1
Número 2
Número 3
Número 4

Ejemplos

Contar:

#!/bin/bash
for i in {1..25}
do
    echo $i
done

O bien:

#!/bin/bash
for ((i=1;i<=25;i+=1))
do
    echo $i
done

Contar de n en n pasos:

#!/bin/bash
for i in {0..25..5}
do
    echo $i
done

Esto cuenta de 5 en 5.

Contar hacia atrás:

#!/bin/bash
for i in {25..0..-5}
do
    echo $i
done

Actuar sobre archivos:

Uno de los mejores usos del bucle for en Bash es trabajar con archivos:

for file in ~/*.md
do
    echo $file
done

Ese ejemplo lista todos los archivos con extensión .md, equivalente a ls *.md.

break y continue en el bucle for

A veces querrás interrumpir el bucle antes de que termine. Por ejemplo, cuando buscas que se cumpla una condición:

for i in [serie]
do
    comando1
    comando2
    if (condición)
    then
        break
    fi
    comando3
done

Con break detienes completamente el bucle. Con continue, en cambio, saltas al siguiente valor de la serie sin ejecutar el resto de los comandos de esa iteración:

for i in [serie]
do
    comando1
    comando2
    if (condición)
        continue
    fi
    comando3
done

Bucles for en una sola línea

En la línea de comandos no siempre se insertan los bucles en scripts, por lo que a veces los escribimos en una sola línea.

Con contador:

for i in {1..3}; do echo 'hola'; done

O bien:

for ((i=1;i<=3;i++)); do echo "hola"; done

Números pares hasta 30:

for ((i=0;i<=30;i+=2)); do echo "$i es par"; done

Copiar todos los archivos PDF a un directorio de respaldo:

for i in *.pdf; do cp $i /backup/; done

Agregar extensión .bak a todos los archivos .txt:

for i in *.txt; do mv $i $(basename $i .txt).bak; done

Última actualización: junio de 2019

Por: Guillermo Garron