GNU/Linux >> Tutoriales Linux >  >> Linux

Bash For Loop:la guía más práctica

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.
  • paraenhacer,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 dohecho .

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

#!/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 010 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 2030 . 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 1015 . 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.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 abcd 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.


Linux
  1. ¿Paralelizar un Bash For Loop?

  2. ¿Límite práctico en el número de instantáneas Btrfs?

  3. El Bash'?

  4. Ejemplos de ciclos for y while de Bash

  5. Cómo obtener el estado de salida de un bucle en bash

La lista de atajos de teclado Bash útiles

Bash Scripting – Para bucle explicado con ejemplos

Una guía práctica para el comando chroot en Linux

Comprender el bucle for en los scripts de Shell

El comando apt:una guía práctica de uso

El Bash FOR Loop explicado y simplificado