Bash: bucles (for, while, until)

Un bucle es un trozo de código que repite la ejecución de un comando o comandos mientras la condición es verdadera. Bash tiene diferentes formas para realizar bucles (for, while, until).

  • FOR
    Tiene dos formatos, uno tipo lenguaje C y otro totalmente diferente:

    for variable in [lista]
    do
     comando(s)...
    done
    for ((variable=valor_inicial; a <= limite ; incremento))
    do
      comando(s)...
    done
  • WHILE
    while [ condicion ]
    do
     comando(s)...
    done
  • UNTIL
    until [ condicion ]
    do
     comando(s)...
    done

NOTA: si el do va en la misma línea que el for, while o until, antes del do debe haber un ‘;‘. Por ejemplo: “for variable in [lista]; do”.

También como en otros lenguajes podemos tomar el control de los bucles con los siguiente comandos:

  • Continue, provoca que se salte al siguiente valor de la lista o condición ignorando el resto de comandos que haya por debajo.
  • Break, provoca que se salte al siguiente comando justo seguido del bucle aunque este no haya terminado, es una ruptura del bucle.

—- Ejemplos —-

* Bucle FOR simple:

#!/bin/bash

for numeros in 1 2 3 4 5 6 7 8 9
do
  echo $numeros  # cada numero en una linea separada
done

echo

for numeros in "1 2 3 4 5 6 7 8 9"
    # Todos los número en la misma linea.
    # Una lista entre comillas crea una única variable.
do
  echo $numeros
done

Salida:

1
2
3
4
5
6
7
8
9

1 2 3 4 5 6 7 8 9

* Bucle FOR con dos valores en cada elemento de la lista:

#!/bin/bash

# Asociar cada planeta con su distancia del sol.

for planet in "Mercury 36" "Venus 67" "Earth 93"  "Mars 142" "Jupiter 483"
do
  set -- $planet
  #  divide los valores y crea parámetros posicionales ($1, $2 ...)
  #  "--" evita problemas si $planet empieza con guiones o es una cadena vacía.

  echo "$1              $2,000,000 millas del sol"
  #-------2  tabuladores-añade ceros al parámetro $2
done

salida:

Mercury         36,000,000 miles from the sun
Venus           67,000,000 miles from the sun
Earth           93,000,000 miles from the sun
Mars            142,000,000 miles from the sun
Jupiter         483,000,000 miles from the sun

NOTA: Como “set — $planet” sobre escribe los valores de los parámetros $1, $2, etc puede ser necesario guardar los varoles para después recuperarlos. Esto lo podemos hacer con el uso de un array: parametros_originales=(“$@”)

* Bucle FOR al estilo C:

#!/bin/bash

LIMITE=9

for ((a=1; a < = LIMITE ; a++))  # Doble paréntesis y "LIMITE" sin "$".
do
  echo -n "$a " # -n = no añade retorno de carro
done
echo

salida:

1 2 3 4 5 6 7 8 9

* Bucle WHILE simple:

#!/bin/bash

LIMITE=10
a=1

while [ "$a" -le $LIMITE ]
do
  echo -n "$a " # -n = no añade retorno de carro
  let "a+=1"
done

echo

salida:

1 2 3 4 5 6 7 8 9 10

* Bucle UNTIL simple:

#!/bin/bash

LIMITE=10
a=1

until [ "$a" -ge $LIMITE ]
do
  echo -n "$a " # -n = no añade retorno de carro
  let "a+=1"
done

echo

salida:

1 2 3 4 5 6 7 8 9 10