Intento. Bucles en Bash

¡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

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.

Artículos Relacionados