Comando while de Linux

Regla mnemotécnica

while: Mientras en ingles.

While

El comando while es una instrucción de control de flujo que permite ejecutar una serie de comandos repetidamente sobre la base de una condición dada, es decir, genera un bucle. Cuando la condición deje de cumplirse, la ejecución del programa saldrá del bucle y no realizará más iteraciones. En los bucles while siempre hay que asegurarse de que siempre exista la condición que nos sacará del mismo, sino, entraremos en los peligrosos bucles infinitos donde se ejecuta la secuencia infinitamente. En caso de suceder esto es útil saber que podemos pulsar CTRL+C que mata el comando en curso.

Estructura del comando while

El comando while tiene la siguiente estructura

while [ condicion ]
do
    comandoA
    comandoB
done

donde los comandos entre do y done se ejecutan mientras se cumple la condición y se pueden poner tantos comandos como se desee. Si deseamos escribirlo en una línea este queda como:

while [ condicion ]; do comandoA ; comandoB ; done

Algunas expresiones que podemos usar como condición ya las ilustramos con el comando condicional if y puedes consultarlas en ese enlace. Se puede usar el comando continue para saltar a la siguiente iteración del bucle y el comando break para interrumpirlo. Veámoslo mejor con unos ejemplos.

 

Ejemplos Básicos

Aquí tenemos un bucle básico con while

i=1
while [ $i -le 10 ]
do
    echo "Estamos en la iteración $i"
    ((i++))
done

donde se imprimirá en pantalla "Estamos en la iteración 1", 2, 3, etc. hasta 10. Cuando ya no se cumple que i es menor o igual (-le: less or equal) a 10 se sale del bucle. ((i++)) es equivalente a i=$(($i+1)) e incrementa el contador i en una unidad. Ahora vamos a  ejecutar el mismo bucle pero saltándonos la iteración 4.

i=0
while [ $i -le 10 ]
do
    ((i++))

    if [ $i == 4 ]
    then
        continue
    fi
    echo "Estamos en la iteración $i"
done

Vemos que cuando i==4 vuelve de nuevo al inicio del bucle y no ejecuta la orden echo. Es importante como hemos cambiado el incremento del índice i al principio del bucle. Si estuviese al final el bucle se quedaría ejecutándose infinitamente con el valor i=4. Si en vez del comando continue hubiésemos usado el comando break, en la iteración 4 habría terminado la ejecución del comando while, se rompe el blucle, y continuaría con el script. También podemos crear un bucle infinito y usar el comando break para salir de él. En el siguiente ejemplo si el fichero abort no existe el bucle se ejecuta infinitamente, en el momento en que se crea el fichero abort, se detecta mediante el if, se sale del bucle.

while [ 1 == 1 ]
do
    echo "Estoy en el bucle."

    if [ -f abort ]
    then
        echo "El fichero abortar exite. Saliendo..."
        break
    fi
done

Por supuesto, también se pueden ejecutar bucles anidados, unos dentro de otros, como en el siguiente ejemplo.

i=1
while [ $i -le 5 ]
do
    #Para cada i un buble descendente hasta el valor i
    j=5
    while [ $j -ge $i ]
    do 
        echo "Estamos en la iteración i=$i j=$j"
        ((j--))
    done
    ((i++))
done

 

Ejemplos en un entorno de cálculo

Ejemplo 1:  Ejecutar el comando qstat -u $USER cada 30 minutos, donde $USER es una variable de entorno que define al usuario. La ejecución del bucle no modifica la condición de salida por lo que estamos ante un bucle infinito.

a=1
while [ $a == 1 ]
do
    qstat -u $USER
    #Esperamos sin hacer nada 1800 segundos, 20 minutos
    sleep 1800
done

Ejemplo 2: Mandar 10 trabajos (1.pbs, 2.pbs, …,10.pbs) a un sistema de colas PBS/Torque con el comando qsub:

x=10
while [ $x != 0 ]
do
    qsub $x.pbs
    x=$(echo $x-1 | bc)
done

o en una sola línea:

x=10; while [ $x != 0 ]; do qsub $x.pbs; x=$(echo $x-1 | bc); done

 

 

Leave a Reply