GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Beginner Series #8:Bucles en Bash

¡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.


Linux
  1. Cómo escribir un bucle en Bash

  2. Scripts de Linux:3 procedimientos para bucles while en Bash

  3. Bash Beginner Series #9:Uso de funciones en Bash

  4. Serie RHCE Ansible n.º 5:bucles Ansible

  5. Bash para ejemplos de bucle

Bash Beginner Series #5:Uso de operadores aritméticos en Bash Scripting

Bash Beginner Series #4:Uso de arreglos en Bash

Bash Beginner Series #3:Pasando Argumentos a Bash Scripts

Bash Beginner Series #7:Toma de decisiones con sentencias If Else y Case

Bash Beginner Series #6:Operaciones de cadenas en Bash

Bash Beginner Series #10:Automatización con Bash