Introducción: Bash Loops: for, while y till

La mayoría de los lenguajes de programación admiten varias formas de líneas de código en bucle. Bash admite de forma nativa bucles ‘while’, bucles ‘hasta’ y los bucles ‘for’ más conocidos. Este artículo presenta y discute los tres.

¿Qué son los bucles bash?

Para definir esto un poco mejor, deberíamos comenzar con la pregunta de qué son los bucles. Los bucles son una construcción del lenguaje de programación, que permite a un desarrollador repetir (es decir, repetir) ciertas partes, o la totalidad, del código dentro de dicha definición de bucle. ¡Ahora es fácil definir Bash Loops como cualquier construcción de lenguaje de programación de bucles utilizada en Bash!

Bash admite de forma nativa bucles basados en ‘for’, ‘until’ y ‘while’. Cada uno de estos tiene sus propias ventajas, pero ya puedes tener una idea de sus significados con solo mirar la palabra principal idiom. Para example, ‘hasta’ lleva a uno a pensar naturalmente en ‘hacer algo hasta’ y esto es lo que hace un bucle Bash ‘hasta’; repite una cierta cantidad de código (o todo) hasta que se cumple una determinada condición.

De manera similar, los bucles ‘while’ continúan ejecutándose hasta que una condición ya no es cierta. Finalmente, bucles ‘for’ loop, for example, un número definido de veces, similar a como escribiríamos ‘for 70 times, do…’. Esto nos ayuda a comprender lógicamente las características únicas que nos proporciona cada bucle y a implementar un código más legible.

para bucles bash basados

A los efectos de este artículo, echaremos un vistazo a la nueva forma de definir Bash para bucles. Una definición algo más antigua, menos moderna, de bucles for en Bash puede, por examplese ve algo como esto:for i in $(seq 1 5); do echo $i; done. Comparemos esto con un bucle de búsqueda más limpio, mejor estructurado y moderno:

for ((i=1;i<=5;i++)); do echo $i; done

Este simple for basado en Bash one-liner (un término que se usa a menudo en Linux/Bash círculos para conceptualizar un miniguión escrito en una sola línea) imprimirá los números del 1 al 5 en orden secuencial. Establecemos un valor inicial para elivariable ($i) asignando el valor1al mismo, como la primera parte de nuestra definición de bucle for, terminado por un;delimitador

A continuación, especificamos que solo uno para subir a ‘menor o igual a cinco’ usandoi<=5. Luego indicamos lo que debe suceder al final de cada ronda, y eso es aumentar la variableipor uno, o, en un uso común (incluso en el lenguaje C ++ para example) codificación abreviada, esto se traduce comoi++.

Finalmente, especificamos el inicio de nuestro código de bucle usandodoes decir, después de dar por terminado nuestrofordefinición de bucle, al igual que cualquier otra terminación de declaración, con;antes dedo. También especificamos el final de nuestro código de bucle usandodoney nosotrosecho(imprimir) el valor de nuestra variable i entre losdoydone.

También tenga en cuenta específicamente que eldocláusula en sí misma no se termina con;, y hacerlo daría lugar a un error. Considera eldoun prefijo de lo que hay que hacer, y tiene más sentido. Esta quizás sea una de las razones por las que a veces es más limpio poner las cosas en un guión de varias líneas, como eldopuede ser simplemente la última palabra en una línea.

Incluso cuando definamos otros tipos de bucles, seguiremos manteniendo eldoydonecláusulas, y siempre nos aseguraremos de terminar nuestra definición de bucle (es decir, antesdo) estafa;así como dar por terminado el final de cada declaración individual dentro de nuestrodo...donedefinición de bucle con;.

Pongamos esto en un pequeño script para ver más claramente cómo pueden funcionar las cosas de esa manera:

#!/bin/bash

for ((i=1;i<=10;i+=2)); do 
  echo $i
done

Un script de bucle basado en Bash for

Después de hacer el script ejecutable conchmod +x test.sh, ejecutamos lo mismo. Se introdujeron algunos pequeños cambios en el guión. Observe cómo esta vez, estamos aumentando la variableipor dos cada vez. Esto se hace usando otra abreviatura de codificación, a saberi+=2que se puede leer como aumentar i por dos. También se puede escribiri=i+2en el mismo lugar, y funciona exactamente igual.

Vemos que comenzamos en 1 y aumentamos en 2 cada vez que hacemos el ciclo, terminando en 9. La razón por la que termina en 9 es que el valor máximo es 10. Así, después de 9 el siguiente valor sería 11, que es mayor que 10 y, por lo tanto, no se muestra ni se repite.

Nótese también cómo el;fue eliminado después de la línea de eco. Esto se debe a que no hay necesidad de terminar el final de una instrucción si en su lugar hay una situación/carácter de final de línea. Este es el caso aquí; no tenemos ningún otro comando después delecho $iy la línea termina inmediatamente (los espacios al final de la línea también estarían bien, el principio es simplemente no tener otro comando a menos que ese nuevo comando tenga el prefijo (y el anterior terminado) por;).

bucles bash basados en while

A continuación, echemos un vistazo a un bucle Bash, utilizando el mismodo...donedefinición de bucle, podemos definir un bucle Bash basado en while que se ejecutará siempre que una condición dada sea verdadera.

i=1; while [ $i -le 5 ]; do echo $i; i=$[ i + 1 ]; done

Un bucle basado en Bash while

En esto examplehacemos lo mismo que nuestro primer bucle basado en for example. Si bien la definición parece más compleja (y, por lo tanto, un ciclo for puede ser más adecuado para este caso de uso particular), es interesante ver cómo podemos definir un ciclo while de la misma manera.

Aquí primero establecemos nuestroivariable, manualmente, en un comando separado terminado por;a 1. A continuación, comenzamos un ciclo while donde establecemos una condición, de una manera muy similar a la definición de unifdeclaración (hay un enlace al final de este artículo a un artículo sobreifdeclaraciones si desea obtener más información), donde estamos comprobando si elivariable es menor o igual (-le) luego 5.

Después de esto tenemos nuestro habitualdo...donebloque en el que estamosechonuestra variable, y posteriormente, en una nueva declaración, manualmente, aumentar el valor de nuestraivariable por uno en un cálculo matemático definido por la$[...]Modismos de cálculo bash. A continuación, revisemos un bucle Bash basado en hasta

hasta bucles bash basados

Armados con lo que aprendimos hasta ahora, ahora podemos evaluar más fácilmente el siguiente bucle Bash basado en hasta:

i=1; until [ $i -gt 5 ]; do echo $i; i=$[ i + 1 ]; done

Un bucle basado en Bash hasta

Aquí buscamos que la condición i mayor que 5 se cumpla. Hasta ese momento (es decir, un bucle basado en hasta), imprimiremos (usandoecho) nuestra variable i y aumentamos la misma con uno, al igual que nuestro anterior while basado example.

Podemos ver cómo la sintaxis del comando till es muy similar a la del comando while. También tenga en cuenta que, a diferencia de laforbasado en un comando, estos comandos buscan una condición verdadera para persistir (con while) o una condición verdadera para comenzar (con hasta). Esto también permite usar otros comandos que pueden devolver un resultado verdadero/falso, como para examplegrep -q:

echo 1 > a
while grep -q '1' ./a; do echo 'yes'; sleep 5; done

Verificación de un estado verdadero usando grep -q en un bucle Bash basado en while

Aquí agregamos el número 1 a un archivo llamado a, y verificamos la existencia del número 1 dentro de ese archivo usando ungrep -q(un grep tranquilo). Seguimos haciéndolo (es decir, mientras) hasta que ya no es cierto. Si bien es cierto, imprimimos el texto yes y pausamos el bucle durante cinco segundos consleep 5. Tenga en cuenta cómo cada comando se termina con;de nuevo.

Después de aproximadamente 17 segundos, interrumpimos nuestro script usando CTRL+c, que es el método universal para detener un proceso en ejecución en Bash (además del más fuerte y efectivo CTRL+z que detiene un proceso inmediatamente, ¡pero eso es para otro artículo!)

Finalizando

En este artículo, revisamos los bucles ‘for’, ‘while’ y ‘until’ que están disponibles de forma nativa en Bash. Si está interesado en más Bash, eche un vistazo a Pruebas condicionales en Bash: si, entonces, si no, funciones elif y Bash y variables locales.

¡Disfrutar!

Actualizaciones del boletín

Ingrese su dirección de correo electrónico a continuación para suscribirse a nuestro boletín