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
Comentarios