¡Cuidado con los bucles infinitos!
La capacidad de bucle es una característica muy poderosa de las secuencias de comandos de bash. Los bucles tienen una variedad de casos de uso.
En este tutorial, explorará las tres estructuras de bucle bash diferentes. También aprenderá a usar bucles para atravesar elementos de matriz.
Además, aprenderá a usar instrucciones 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 para escribir un bucle for.
- Estilo C para bucles
- Uso del bucle for en una lista/rango de elementos
C-style For Loops en Bash
Si está familiarizado con un lenguaje de programación similar a C o C++, entonces reconocerá la siguiente sintaxis de bucle for:
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
Usando la sintaxis de estilo C antes mencionada, el siguiente bucle for imprimirá "Hola amigo" diez veces:
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
El ciclo for primero inicializó la variable entera i a cero, entonces prueba la condición (i <10); si es verdadero, entonces el ciclo ejecuta la línea echo “Hello Friend” e incrementa la variable i por 1 , y luego el ciclo se ejecuta una y otra vez hasta que i ya no es menor que 10 .
[email protected]:~$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Lista/Rango For Loops en Bash
También existe otra variación de sintaxis de for loop que es particularmente útil si está trabajando con una lista de archivos (o cadenas), rango de números, matrices, salida de un comando, etc. La sintaxis de lista/rango for loop toma la siguiente forma :
for item in [LIST]; do
[COMMANDS]
done
Por ejemplo, el siguiente bucle for hace exactamente lo mismo que el bucle for de estilo C que había creado en la sección anterior:
for i in {1..10}; do
echo "Hello Friend"
done
El var.sh La secuencia de comandos a continuación generará todos los archivos y directorios que existen en /var directorio:
#!/bin/bash
for i in /var/*; do
echo $i
done
A continuación se muestra un resultado de muestra cuando 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
While Bucles en Bash
El ciclo while es otro ciclo popular e intuitivo que puede usar en scripts de bash. La sintaxis general para un ciclo while es la siguiente:
while [ condition ]; do
[COMMANDS]
done
Por ejemplo, el siguiente 3x10.sh script usa un ciclo while que imprimirá los primeros diez múltiplos del número 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ó el num variable a 1; entonces, el ciclo while se ejecutará mientras num es menor o igual a 10 . Dentro del cuerpo del bucle while, el comando de eco imprime num multiplicado por tres y luego incrementa num por 1 .
Hasta bucles en Bash
Si proviene de un entorno C/C++, es posible que esté buscando un bucle do-while, pero ese no existe en bash.
Hay otro tipo de bucle que existe en bash. El ciclo hasta sigue la misma sintaxis que el ciclo while:
until [ condition ]; do
[COMMANDS]
Done
La diferencia clave entre el ciclo hasta y el ciclo while está en la condición de prueba. Un bucle while seguirá ejecutándose mientras la condición de prueba sea verdadera; por otro lado, un ciclo hasta seguirá ejecutándose mientras la condición de prueba sea falsa.
Por ejemplo, puede crear fácilmente el 3x10.sh secuencia de comandos con un bucle hasta en lugar de un bucle while; 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
Observe que la negación de la condición de prueba [ $num -le 10 ]; es [ $num -gt 10 ];
Más información sobre bucles en bash scripts
Ahora que está familiarizado con los bucles en los scripts bash
Imprimir el contenido de una matriz en bash
Si está siguiendo esta serie de tutoriales desde el principio, debe 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 elementos de matriz.
Por ejemplo, el siguiente prime.sh el script itera e imprime cada elemento en la matriz principal:
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
Este es el resultado 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 de un ciclo antes de tiempo u omitir una iteración del ciclo. Para hacer esto, puede usar las instrucciones break y continue.
La instrucción break finaliza la ejecución de un bucle y cambia el control del programa al siguiente comando o instrucción que sigue al bucle.
Por ejemplo, el siguiente bucle solo imprimiría los 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 continuar instrucción para omitir una iteración de bucle. El ciclo continúa y pasa a la siguiente iteración, pero los comandos posteriores a las declaraciones de continuación se omiten en esa iteración particular.
Por ejemplo, el siguiente odd.sh el script solo imprimiría los 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á la salida que imprime números impares:
[email protected]:~$ ./odd.sh
1
3
5
7
9
Bucles infinitos en bash
Un bucle infinito es un bucle que sigue funcionando para siempre; esto sucede cuando la condición de prueba de bucle siempre es verdadera.
En la mayoría de los casos, los bucles infinitos son producto de un error lógico humano.
Por ejemplo, alguien que quiera crear un ciclo que imprima los números del 1 al 10 en orden descendente puede terminar creando el siguiente ciclo infinito por error:
for ((i=10;i>0;i++)); do
echo $i
done
El problema es que el bucle sigue incrementando la variable i por 1 . Para solucionarlo, debe cambiar i++ con yo-- de la siguiente manera:
for ((i=10;i>0;i--)); do
echo $i
done
En algunos casos, es posible que desee 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 de la siguiente manera:
for ((;;)); do
[COMMANDS]
done
Si desea crear un ciclo while infinito, puede crearlo de la siguiente manera:
while [ true ]; do
[COMMANDS]
done
¡Impresionante! Esto nos lleva al final de este tutorial en la Serie para principiantes de Bash. ¡Espero que hayas disfrutado haciendo bucles en bash!
Ahora practica el bucle con algunos ejercicios simples. También obtiene la solución en el PDF a continuación.
Bash Capítulo 8 Preguntas de práctica Problemas y su solución para practicar lo que acabas de aprender en este capítulo Bash-Chapter-8-Practice-Questions-Linux-Handbook.pdf28 KB
Eche un vistazo al siguiente capítulo, ya que aprenderá a reutilizar código en sus scripts bash mediante la creación de funciones.