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 eli
variable ($i
) asignando el valor1
al 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 variablei
por 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 usandodo
es decir, después de dar por terminado nuestrofor
definició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 usandodone
y nosotrosecho
(imprimir) el valor de nuestra variable i entre losdo
ydone
.
También tenga en cuenta específicamente que eldo
cláusula en sí misma no se termina con;
, y hacerlo daría lugar a un error. Considera eldo
un 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 eldo
puede ser simplemente la última palabra en una línea.
Incluso cuando definamos otros tipos de bucles, seguiremos manteniendo eldo
ydone
clá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...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 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 variablei
por dos cada vez. Esto se hace usando otra abreviatura de codificación, a saberi+=2
que se puede leer como aumentar i por dos. También se puede escribiri=i+2
en 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 $i
y 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...done
definició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
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 nuestroi
variable, 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 unif
declaración (hay un enlace al final de este artículo a un artículo sobreif
declaraciones si desea obtener más información), donde estamos comprobando si eli
variable es menor o igual (-le
) luego 5.
Después de esto tenemos nuestro habitualdo...done
bloque en el que estamosecho
nuestra variable, y posteriormente, en una nueva declaración, manualmente, aumentar el valor de nuestrai
variable 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
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 lafor
basado 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
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!