La mayoría de los lenguajes de programación admiten varias alternativas para líneas de código en bucle. Bash admite de forma nativa bucles ‘while’, bucles ‘hasta’ y los bucles ‘for’ más conocidos. Este post presenta y analiza los tres.
Cuáles son Bash Loops?
Para establecer esto un poco mejor, deberíamos comenzar con la pregunta que son los bucles. Los bucles son una construcción del lenguaje de programación, que posibilita a un desarrollador repetir (dicho de otra forma, repetir) ciertas partes, o todo, del código dentro de dicha definición de bucle. Ahora es fácil de establecer Bash Loops como cualquier construcción de lenguaje de programación de bucles utilizada en Bash!
Bash admite de forma nativa los bucles basados en ‘for’, ‘until’ y ‘while’. Cada uno de estos tiene sus propias ventajas, pero ya puede hacerse una idea de sus significados con solo mirar el modismo de la palabra principal. A modo de ejemplo, ‘hasta’ lleva a uno a pensar naturalmente en ‘hacer algo hasta’ y esto es lo que hacen los bucles Bash ‘hasta’; repite una cierta cantidad de código (o todo) hasta que se cumple una determinada condición.
De manera equivalente, los bucles ‘while’ continúan ejecutándose hasta que una condición ya no es cierta. Para terminar, los bucles ‘for’ se repiten, a modo de ejemplo, un número definido de veces, equivalente a cómo escribiríamos ‘por 70 veces, haz…’. Esto nos ayuda a comprender lógicamente las características únicas que nos proporciona cada bucle y a poner en práctica un código más legible.
por Bucles de bash basados
Para los propósitos de este post, veremos la forma más nueva de establecer Bash para bucles. Una definición algo más antigua y menos moderna de por los bucles en Bash pueden, a modo de ejemplo, verse así: for i in $(seq 1 5); do echo $i; done
. Comparemos esto con un aspecto más limpio, mejor estructurado y moderno. por círculo:
for ((i=1;i<=5;i++)); do echo $i; done
Así de simple por Bash one-liner basado en (una definición que se utiliza a menudo en los círculos de Linux / Bash para conceptualizar un mini-script escrito en una sola línea) imprimirá los números del 1 al 5 en orden secuencial. Establecemos un valor de inicio para el i
variable ($i
) asignando el valor 1
al mismo, como la primera parte de nuestro por definición de bucle, terminado por un ;
delimitador.
A continuación, especificamos que solo tenemos uno para subir ‘menor o igual a cinco’ a través de el uso i<=5
. Posteriormente indicamos lo que debería suceder al final de cada ronda, y eso es incrementar la variable i
por uno, o, en una abreviatura de codificación de uso común (incluido en el lenguaje C ++, a modo de ejemplo), esto se traduce como i++
.
Para terminar especificamos el inicio de nuestro código de ciclo usando do
, dicho de otra forma, después de terminar nuestro for
definición de bucle, del mismo modo que cualquier otra terminación de declaración, con ;
antes de do
. Además especificamos el final de nuestro código de ciclo usando done
y nosotros echo
(imprimir) el valor de nuestra variable I entre el do
y done
.
Además tenga en cuenta específicamente que el do
la cláusula en sí no termina con ;
, y hacerlo provocaría un error. Considera el do
un prefijo a lo que se debe hacer, y tiene más sentido. Esta tal vez sea una de las razones por las que a veces es más limpio poner las cosas en un script de varias líneas, dado que do
puede ser simplemente la última palabra de una línea.
Inclusive al establecer otros tipos de bucles, seguiremos manteniendo el do
y done
cláusulas, y siempre nos aseguraremos de terminar nuestra definición de bucle (dicho de otra forma, antes do
) con ;
, así como finalizar el final de cada declaración individual dentro de nuestra do...done
definició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
Después de hacer que el script sea ejecutable con chmod +x test.sh
, ejecutamos lo mismo. Se introdujeron algunos pequeños cambios en el guión. Observe cómo esta vez, estamos aumentando la variable i
por dos cada vez. Esto se hace usando otra abreviatura de codificación, a saber i+=2
que se puede leer como incrementar i en dos. Además se puede escribir i=i+2
en el mismo lugar, y funciona exactamente igual.
Vemos que empezamos en 1y incrementar en 2 cada vez que pasamos por el bucle, que termina en 9. El motivo por la que termina en 9 es que el valor máximo es 10. Por eso, después de 9 el siguiente valor sería 11, que es mayor que 10 y por eso no se muestra / enlaza.
Tenga en cuenta además cómo ;
fue eliminado después de la línea de eco. Esto se debe a que no es necesario terminar el final de una declaració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 del echo $i
y la línea termina inmediatamente (los espacios al final de la línea además 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 ;
).
tiempo Bucles de bash basados
A continuación, echemos un vistazo a un bucle Bash, usando el mismo do...done
definición de bucle, podemos establecer un mientras que el bucle de Bash basado que se ejecutará siempre que una condición determinada sea verdadera.
i=1; while [ $i -le 5 ]; do echo $i; i=$[ i + 1 ]; done
En este ejemplo, hacemos lo mismo que nuestro primer por ejemplo de bucle basado. Aunque la definición parece más compleja (y por eso una por bucle puede ser más adecuado para este caso de uso particular), es interesante ver cómo podemos establecer un tiempo bucle de la misma manera.
Aquí primero establecemos nuestro i
variable, manualmente, en un comando separado terminado por ;
, para 1. A continuación, empezamos un tiempo bucle donde establecemos una condición, de una manera muy equivalente a la definición de un if
declaración (hay un link al final de este post a un post sobre if
declaraciones si desea obtener más información), donde estamos verificando si el i
la variable es menor o igual (-le
) después 5.
Después de esto tenemos nuestro frecuente do...done
bloque en el que echo
nuestra variable, y posteriormente, en una nueva declaración, manualmente, incrementar el valor de nuestra i
variable por uno en un cálculo matemático según lo definido por el $[...]
Bash modismos de cálculo. A continuación, revisemos un hasta el bucle de Bash basado
Hasta que Bucles de bash basados
Armados con lo que hemos aprendido hasta ahora, ahora podemos examinar más fácilmente lo siguiente Hasta que bucle de Bash basado:
i=1; until [ $i -gt 5 ]; do echo $i; i=$[ i + 1 ]; done
Aquí buscamos la condición I mayor que 5 para hacerse realidad. Hasta ese momento (dicho de otra forma, un Hasta que bucle basado en), imprimiremos (usando echo
) nuestra variable I y incrementar lo mismo con uno, igual que nuestro anterior tiempo ejemplo basado.
Podemos ver cómo la sintaxis de la Hasta que comando es muy equivalente al tiempo mando. Además tenga en cuenta que, a diferencia del for
comando basado, estos comandos buscan un cierto condición para persistir (con tiempo), o a por un cierto condición para comenzar (con Hasta que). Esto además posibilita utilizar otros comandos que pueden devolver una salida equivalente a verdadero / falso, como a modo de ejemplo grep -q
:
echo 1 > a while grep -q '1' ./a; do echo 'yes'; sleep 5; done
Aquí sumamos el número 1 a un archivo llamado ay compruebe la existencia del número 1 dentro de ese archivo usando un grep -q
(un grep silencioso). Seguimos haciéndolo (dicho de otra forma tiempo) hasta que ya no sea cierto. Aunque es cierto, imprimimos el texto sí y pausa el bucle durante cinco segundos con sleep 5
. Observe cómo cada comando termina con ;
de nuevo.
Después de unos 17 segundos, interrumpimos nuestro script usando CTRL + c, que es el método universal para detener un procedimiento en ejecución en Bash (al mismo tiempo del CTRL + z más fuerte y efectivo que pausa un procedimiento inmediatamente, ¡pero eso es para otro post!)
Terminando
En este post, 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: if, then, else, funciones elif y Bash y variables locales.
¡Disfrutar!