Continuando con los tutoriales sobre Bash hoy os voy a hablar de los bucles for, until y while.
En ambos casos la sintaxis es la mismas para los bucles until y while, siendo for una pequeña excepción:
for variable in lista do ... done until <condicion> do ... done while <condición> do ... done
En una sola linea:
for variable in lista; do ... ; done until <condicion>; do ... ; done while <condición>; do ...; done
Comencemos con el bucle for. Este quizás os suene de otros lenguajes, tanto de programación como de comandos, suele ser utilizado cuando queremos que el bucle se ejecute un número determinado de veces. Siguiendo la sintaxis mostrada arriba: por cada elemento/linea en lista el bucle se ejecutara una vez y ese elemento será guardado en variable. Vamos a ver un pequeño ejemplo:
#!/bin/bash lista="1 2 3 4 " for variable in $lista do echo $variable done
En este ejemplo vemos que he definido una variable lista con 4 elementos/lineas, el bucle for entonces recorre la variable lista obteniendo la información en cada elemento/linea y haciendo un echo de la misma. El bucle for no solo admite este tipo de listados sino que también puede recibir el output de la ejecución de un comando:
#!/bin/bash for variable in $(echo "1"; echo "2") do echo $variable done
En este caso el resultado de los dos echos serian dos lineas, esto bien podría ser el resultado de un ls; y el bucle for tomara cada una de esas lineas y la guardara en variable en cada ciclo.
También podemos utilizar rangos:
#!/bin/bash for variable in {0..10} do echo $variable done
Esto imprimirá los números del 0 al 10, en algunos casos nos puede interesar obtener los números en el formato 01 o 001 por ejemplo, esto se consigue fácilmente añadiendo dicho número de 0 en el rango, por ejemplo, {00..10} nos dará la seria 00,01,02,..,10.
Para aquellos que como yo vengais de C quizás os guste más un for de este estilo:
#!/bin/bash for (( variable=0; variable<=10; variable++ )) do echo $variable done
Este bucle funciona exactamente igual que en C y otros lenguajes que utilizan una sintaxis similar. Notar el doble paréntesis y los espacios entre los mismos y la definición del bucle.
Los bucles Until y While son prácticamente idénticos, la diferencia reside en la condición para que estos se ejecuten:
- Until: Se ejecutará hasta que la condición sea verdadera.
- While: Se ejecutará mientras la condición sea verdadera.
Veamos dos ejemplos:
#!/bin/bash condicion=20 until [ $condicion -lt 10 ] do echo $condicion let condicion=condicion-1 done
En este caso el bucle se ejecutará y nos mostrara los números del 20 al 10 en orden descendente. ¿Que pasa si hacemos lo mismo con while?
#!/bin/bash condicion=20 while [ $condicion -lt 10 ] do echo $condicion let condicion=condicion-1 done
En este caso el script no muestra nada ya que la condición es falsa desde un principio.
Como comentaba antes en los bucles for al estilo C muchas veces he echado poder realizar un bucle do..while pero este no existe en Bash, para esos casos me he decantado por utilizar el Until ya que es lo más parecido.
En ambos casos podemos realizar bucles infinitos, simplemente les diremos que la condición es true para while y false para until, de esta manera el bucle nunca terminara ¿o si?
Existirán veces en que necesitemos controlar los diferentes bucles desde dentro de los mismos, para esto existen las ordenes:
- continue: Para el ciclo actual del bucle y pasa al siguiente ignorando el resto de comandos.
- break: Sale del bucle y continua con la ejecución del script.
Veamos un ejemplo:
#!/bin/bash condicion=20 while true do echo $condicion if [ $condicion -eq 15 ] then let condicion=condicion-2 continue elif [ $condicion -eq 10 ] then break else let condicion=condicion-1 fi done
Como veis he creado un bucle infinito donde el while siempre se cumplirá pero he añadido ciertas condiciones dentro del mismo para tener control y que no se ejecute por siempre jamás.
La primera condición se cumple cuando la variable condición es igual a 15, el bucle entonces restará 2 en lugar de 1 y pasara al siguiente ciclo; esto hará que se salte el número 14.
La segunda condición se cumple cuando la variable condición es igual a 10 y le dice al bucle que debe finalizar.
Como veis he utilizado los condicionales if, elif y else que todavía no hemos visto y que trataré en detalle en la siguiente parte de esta serie de tutoriales.
Espero que os haya gustado, y como siempre, cualquier duda dejad un comentario y os contestaré gustosamente.
Saludos y gracias por vuestra visita!