¡Cuidado con los bucles interminables!
El bucle es una característica muy poderosa de las secuencias de comandos de bash. Los bucles tienen muchos usos.
En este artículo, explorará tres estructuras de bucle bash diferentes. También aprenderá a usar bucles para iterar sobre los elementos de una matriz.
Además, aprenderá a usar las sentencias break y continue para controlar bucles y, por último, aprenderá a crear bucles infinitos.
Para bucles en Bash
Los bucles for son uno de los tres tipos diferentes de estructuras de bucle que puede usar en bash. Hay dos estilos diferentes de escribir un bucle for.
- Estilo C para bisagras
- Usando un bucle for en una lista/rango de elementos
Estilo C para bucles en Bash
Si está familiarizado con el lenguaje de programación C o C ++, aprenderá lo siguiente para la sintaxis de bucle:
for ((initialize ; condition ; increment)); do [COMMANDS] done
Usando la sintaxis de estilo C anterior, el siguiente bucle for imprimirá "Hola amigo" diez veces:
for ((i = 0 ; i < 10 ; i++)); do echo "Привет друг" done
El ciclo for primero inicializa la variable entera i a cero, luego verifica la condición (i <10); si es cierto, entonces el ciclo repite la cadena "Hola amigo" e incrementa i en 1, y luego el ciclo comienza una y otra vez hasta que i es mayor que 10.
[email protected]:~$ bash hello.sh Привет друг Привет друг Привет друг Привет друг Привет друг Привет друг Привет друг Привет друг Привет друг Привет друг
Lista / Rango para bucles en Bash
También hay otra variación de la sintaxis del bucle for que es especialmente útil si está trabajando con una lista de archivos (o cadenas), un rango de números, matrices, salida de comandos, etc. La sintaxis de lista/rango para un bucle es:
for item in [LIST]; do [COMMANDS] done
Por ejemplo, el siguiente bucle for hace lo mismo que el bucle for de estilo C que creó en la sección anterior:
for i in {1..10}; do echo "Привет друг" done
El siguiente script var.sh listará todos los archivos y directorios que existen en el directorio /var:
#!/bin/bash for i in /var/*; do echo $i done
A continuación se muestra un ejemplo de la salida cuando se ejecuta el script var.sh:
[email protected]:~$ ./var.sh /var/backups /var/cache /var/crash /var/lib /var/local /var/lock /var/log /var/mail /var/metrics /var/opt /var/run /var/snap /var/spool /var/tmp
Mientras que los bucles en bash
El ciclo while es otro ciclo popular e intuitivo que se puede usar en scripts bash. La sintaxis general para un ciclo while es la siguiente:
while [ condition ]; do [COMMANDS] done
Por ejemplo, el siguiente script 3 × 10.sh usa un ciclo while que imprime los primeros diez múltiplos de tres:
#!/bin/bash num=1 while [ $num -le 10 ]; do echo $(($num * 3)) num=$(($num+1)) done
Aquí está el resultado del script anterior:
[email protected]:~$ ./3x10.sh 3 6 9 12 15 18 21 24 27 30
Primero, inicializó la variable num a 1; luego, el ciclo while se ejecutará siempre que num sea menor o igual a 10. Dentro del recinto mientras se realiza el ciclo, el comando echo se imprime en NUM multiplicado por tres y luego incrementa Num desde 1.
Antes de los bucles en Bash
Si está trabajando en C / C ++, puede estar buscando un bucle do-while, pero no está en bash.
Hay otro tipo de bucle en bash. La sintaxis para el ciclo while es la misma que para el ciclo while:
until [ condition ]; do [COMMANDS] Done
La diferencia clave entre un bucle hasta y un bucle while es la condición de prueba. El bucle while se ejecutará siempre que se cumpla la condición de prueba; por otro lado, ¡bucle hasta que la condición de prueba sea falsa!
Por ejemplo, puede crear fácilmente una secuencia de comandos 3x10sh con un bucle de despedida en lugar de un bucle hasta; el truco aquí es negar la condición de prueba:
#!/bin/bash num=1 until [ $num -gt 10 ]; do echo $(($num * 3)) num=$(($num+1)) done
Tenga en cuenta que negar una condición de verificación [$ num -le 10]; igualmente [$ num -gt 10];
Más sobre bucles en bash scripting
Ahora que está familiarizado con los bucles en bash scripting
Imprimir el contenido de una matriz en bash
Si ha estado siguiendo esta serie desde el principio, debería estar familiarizado con las matrices en bash.
Los bucles for son a menudo la opción más popular cuando se trata de iterar sobre los elementos de una matriz.
Por ejemplo, el siguiente script prime.sh itera e imprime cada elemento en una matriz de números primos:
#!/bin/bash prime=(2 3 5 7 11 13 17 19 23 29) for i in "${prime[@]}"; do echo $i done
Esta es la salida del script prime.sh:
[email protected]:~$ ./prime.sh 2 3 5 7 11 13 17 19 23 29
Usando Break and Continue en bash loops
A veces, es posible que desee salir del ciclo antes de tiempo u omitir la iteración del ciclo. Puede usar las instrucciones break y continue para esto.
La instrucción break finaliza la ejecución del ciclo y cambia el control del programa al siguiente comando o instrucción que sigue al ciclo.
Por ejemplo, el siguiente bucle solo imprimirá números del uno al tres:
for ((i=1;i<=10;i++)); do echo $i if [ $i -eq 3 ]; then break fi done
También puede usar la instrucción continuar para omitir la iteración del ciclo. El ciclo continúa y pasa a la siguiente iteración, pero los comandos posteriores a las declaraciones de continuación se omiten en esta iteración parcial.
Por ejemplo, el siguiente script odd.sh solo imprimirá números impares del uno al diez, ya que omite todos los números pares:
#!/bin/bash for ((i=0;i<=10;i++)); do if [ $(($i % 2)) -ne 1 ]; then continue fi echo $i done
Aquí está el resultado que imprime números impares:
[email protected]:~$ ./odd.sh 1 3 5 7 9
Bucles sin fin en bash
Un ciclo sin fin es un ciclo que continúa para siempre; esto sucede cuando la condición de verificación de bucle siempre es verdadera.
En la mayoría de los casos, los bucles infinitos son el resultado de un error lógico humano.
Por ejemplo, alguien que quisiera crear un bucle que imprima los números del 1 al 10 en orden descendente podría crear por error el siguiente bucle infinito:
for ((i=10;i>0;i++)); do echo $i done
El problema es que el ciclo sigue incrementando i en 1. Para arreglar esto, necesitas reemplazar i ++ con i– así:
for ((i=10;i>0;i--)); do echo $i done
En algunos casos, puede crear intencionalmente bucles infinitos para esperar a que se cumpla una condición externa en el sistema. Puede crear fácilmente un bucle for infinito como este:
for ((;;)); do [COMMANDS] done
Si desea crear un ciclo while sin fin, puede crearlo así:
while [ true ]; do [COMMANDS] done
Esto nos lleva al final de nuestro artículo Bash para principiantes. ¡Espero que hayas disfrutado haciendo bucles en bash!
Estén atentos a las noticias de la próxima semana mientras aprenden a reutilizar código en scripts de bash mediante la creación de funciones.