Este artículo continúa la serie de artículos de Bash y se centra en las iteraciones. Los bucles en Bash son útiles para cualquier administrador de sistemas y programador. Las construcciones en bucle en cualquier lenguaje de secuencias de comandos le permiten ejecutar múltiples comandos y volver a ejecutarlos hasta que se alcance una situación específica. En términos simples, los bucles son útiles para automatizar tareas repetitivas. Hay tres construcciones de bucle en un lenguaje de secuencias de comandos de shell:
- Mientras -bucle.
- Para -bucle.
- Hasta -bucle.
Un para -loop es una declaración de iteración en lenguaje Bash que se utiliza para realizar un conjunto de acciones. Puede usarlo en un indicador de shell o dentro de un script de shell. Opera en listas de elementos y repite un conjunto de comandos para cada elemento de la lista.
Sintaxis básica
La sintaxis básica se muestra a continuación:
for item in [LIST]
do
COMMANDS
done
donde:
- LISTA es una serie de cadenas o números separados por espacios.
- COMANDOS es un conjunto de comandos que se ejecuta sobre una lista de elementos.
- para , en , hacer, y hecho son palabras clave de sintaxis de bucle.
- elemento es un nombre de variable de Bash que se usa para obtener acceso al elemento de la lista.
Iterando sobre números
Puede usar este tipo de bucle para iterar a través de una serie de números o una lista numérica hasta que se agote la lista.
En el siguiente ejemplo, iteramos a través de números 1 2 3 4 5 .
#!/bin/bash
for var in 1 2 3 4 5
do
echo "Number is $var"
done
Deberías obtener el siguiente resultado:
Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
En el ejemplo anterior, para -loop toma cada elemento de la lista, los almacena en la variable var y ejecuta los comandos entre do y hecho .
También puede especificar un rango de números definiendo el rango de valores.
En el siguiente ejemplo, iteramos a través de todos los números entre 10 y 15 .
#!/bin/bash
for var in {10..15}
do
echo "Number is $var"
done
Deberías obtener el siguiente resultado:
Number is 10
Number is 11
Number is 12
Number is 13
Number is 14
Number is 15
Cuando usa un rango específico dentro del bucle, también puede especificar un incremento para incrementar cada número.
En el siguiente ejemplo, iteramos a través de un rango de números desde 0 a 10 e incrementa cada número en 2 :
#!/bin/bash
for var in {0..10..2}
do
echo "Number is $var"
done
Deberías obtener el siguiente resultado:
Number is 0
Number is 2
Number is 4
Number is 6
Number is 8
Number is 10
Iterando sobre cadenas
También puede usar bucles para iterar sobre una lista de cadenas.
En el siguiente ejemplo, iteramos a través de una lista de cadenas una por una:
#!/bin/bash
for month in Jan Feb Mar Apr May Jun
do
echo "Month is $month"
done
Deberías obtener el siguiente resultado:
Month is Jan
Month is Feb
Month is Mar
Month is Apr
Month is May
Month is Jun
Iterando sobre una matriz
En el siguiente ejemplo, iteramos a través de todos los elementos en CARS matriz:
#!/bin/bash
CARS=('Maruti' 'Toyota' 'BMW' 'Tata' 'Datsun')
for car in "${CARS[@]}"; do
echo "Car: $car"
done
Deberías obtener el siguiente resultado:
Car: Maruti
Car: Toyota
Car: BMW
Car: Tata
Car: Datsun
En el siguiente ejemplo, para -loops itera todos los elementos en una matriz de días de la semana.
#!/bin/bash
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
echo "Weekday $((i++)): $day"
done
Deberías obtener el siguiente resultado:
Weekday 1: Mon
Weekday 2: Tue
Weekday 3: Wed
Weekday 4: Thu
Weekday 5: Fri
Bucles infinitos
Puede crear un bucle infinito usando las expresiones vacías.
#!/bin/bash
for (( ; ; ))
do
echo "Infinite Loops [ press CTRL+C to stop]"
done
Deberías obtener el siguiente resultado:
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Puedes pulsar CTRL+C para detener el ciclo infinito.
Break declaración
Puedes usar el descanso instrucción para salir del bucle antes.
En el siguiente ejemplo, iteramos a través de números entre 20 a 30 . Usaremos si -instrucción para salir del bucle una vez que el elemento iterado actual sea igual a 27 .
#!/bin/bash
for var in {20..30}
do
if [[ "$var" == '27' ]]; then
break
fi
echo "Number is: $var"
done
Deberías obtener el siguiente resultado:
Number is: 20
Number is: 21
Number is: 22
Number is: 23
Number is: 24
Number is: 25
Number is: 26
Continuar sentencia
La declaración de continuación se usa dentro de los bucles. Cuando se encuentra una declaración de continuación dentro de un ciclo, el flujo de control salta al comienzo del ciclo para la siguiente iteración, omitiendo la ejecución de declaraciones dentro del cuerpo del ciclo para la iteración actual.
En el siguiente ejemplo, iteramos a través de números entre 10 a 15 . Cuando el elemento iterado actual es igual a 13 , la declaración de continuar detendrá la ejecución, regresará al comienzo del ciclo y continuará con la siguiente iteración:
#!/bin/bash
for var in {10..15}
do
if [[ "$var" == '13' ]]; then
continue
fi
echo "Number is: $var"
done
Deberías obtener el siguiente resultado:
Number is: 10
Number is: 11
Number is: 12
Number is: 14
Number is: 15
Ejemplos avanzados
Cambiar nombre de extensión de archivo
Esta sección le mostrará cómo cambiar la extensión de todos los archivos en el directorio.
El siguiente ejemplo cambiará la extensión de todos los archivos en el directorio actual de .php a .html .
#!/bin/bash
for file in *.php; do
mv "$file" "${file%.php}.html"
echo $file is renamed to "${file%.php}.html"
done
Deberías obtener el siguiente resultado:
admin.php is converted to admin.html
ajax.php is converted to ajax.html
composer.php is converted to composer.html
index.php is converted to index.html
login.php is converted to login.html
Mostrar número de veces seguidas
En este ejemplo, mostraremos la hora actual del sistema cada 2 segundos.
#!/bin/bash
for now in {1..5}
do
date
sleep 2
done
Deberías obtener el siguiente resultado:
Fri Dec 4 12:19:10 IST 2020
Fri Dec 4 12:19:12 IST 2020
Fri Dec 4 12:19:14 IST 2020
Fri Dec 4 12:19:16 IST 2020
Fri Dec 4 12:19:18 IST 2020
Descomprimir Múltiples Archivos Tar
Puede realizar la misma acción en todos los archivos con la misma extensión. Por ejemplo, descomprimamos varios archivos en el directorio.
El siguiente ejemplo extraerá todos los archivos tar ubicados dentro del directorio actual:
#!/bin/bash
for var in *.tar
do
echo "Processing $var..."
tar -xf "$var"
done
Hacer ping a varios servidores
Puede usar la expresión de bucle para hacer ping a varios servidores de la lista.
Primero, cree un archivo llamado dominio.txt y agregue todos los servidores a este archivo, como se muestra a continuación:
cat domain.txt
Agregue las siguientes líneas:
google.com
facebook.com
yahoo.com
wordpress.com
Ahora, hagamos ping a todos los servidores enumerados en el archivo domain.txt como se muestra a continuación:
#!/bin/bash
for var in $(cat domain.txt)
do
ping -c 1 "$var"
done
Deberías obtener el siguiente resultado:
PING google.com (216.58.203.14) 56(84) bytes of data.
64 bytes from hkg12s09-in-f14.1e100.net (216.58.203.14): icmp_seq=1 ttl=117 time=119 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 119.469/119.469/119.469/0.000 ms
PING facebook.com (69.171.250.35) 56(84) bytes of data.
64 bytes from edge-star-mini-shv-01-any2.facebook.com (69.171.250.35): icmp_seq=1 ttl=56 time=43.9 ms
--- facebook.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 43.994/43.994/43.994/0.000 ms
PING yahoo.com (74.6.231.21) 56(84) bytes of data.
64 bytes from media-router-fp74.prod.media.vip.ne1.yahoo.com (74.6.231.21): icmp_seq=1 ttl=51 time=371 ms
--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 371.135/371.135/371.135/0.000 ms
PING wordpress.com (192.0.78.9) 56(84) bytes of data.
64 bytes from 192.0.78.9: icmp_seq=1 ttl=56 time=40.1 ms
--- wordpress.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 40.162/40.162/40.162/0.000 ms
Lista de archivos con condiciones
Aquí hay un ejemplo que muestra cómo enumerar todos los archivos dentro de un directorio específico que cumplen condiciones específicas.
Por ejemplo, enumere todos los .conf archivos dentro de /etc directorio que comienza con a , b , c o d letras:
#!/bin/bash
i=1
for file in /etc/[abcd]*.conf
do
echo "File $((i++)) : $file"
done
Debería obtener la lista de todos los archivos en el siguiente resultado:
File 1 : /etc/adduser.conf
File 2 : /etc/apg.conf
File 3 : /etc/blkid.conf
File 4 : /etc/brltty.conf
File 5 : /etc/ca-certificates.conf
File 6 : /etc/colord.conf
File 7 : /etc/debconf.conf
File 8 : /etc/deluser.conf
Resumen
En este artículo, hemos cubierto varios ejemplos del uso de Bash para -bucles. Esperamos que ahora tenga una idea de cómo puede automatizar sus propias tareas diarias. Si el artículo fue útil, por favor, ayúdanos a difundirlo en el mundo.