GNU/Linux >> Tutoriales Linux >  >> Linux

12 ejemplos de Bash For Loop para su secuencias de comandos de Linux Shell

Hay dos tipos de bash para bucles disponibles. Uno que usa la palabra clave "in" con una lista de valores, otro que usa la sintaxis similar a la programación en C.

Este artículo es parte de nuestra serie continua de tutoriales de bash.

Esto explica ambos métodos bash for loop y proporciona 12 ejemplos diferentes sobre cómo usar bash for loop en sus scripts de shell.

Marque este artículo como referencia futura, ya que es el único artículo que alguna vez necesitaría consultar cómo usar bash para bucles con ejemplos.

Método 1:Bash For Loop usando "in" y una lista de valores

Sintaxis:

for varname in list
do
 command1
 command2
 ..
done

En la sintaxis anterior:

  • for, in, do y done son palabras clave
  • “lista” contiene una lista de valores. La lista puede ser una variable que contenga varias palabras separadas por espacios. Si falta la lista en la declaración for, entonces toma el parámetro posicional que se pasó al shell.
  • varname es cualquier nombre de variable Bash.

De esta forma, la instrucción for ejecuta los comandos encerrados en un cuerpo, una vez para cada elemento de la lista. Por ejemplo, si la lista de valores contiene 5 elementos, el bucle for se ejecutará un total de 5 veces, una vez por cada elemento de la lista. El elemento actual de la lista se almacenará en una variable "varname" cada vez que pase por el ciclo. Este "varname" se puede procesar en el cuerpo del ciclo for.

Método 2:Bash For Loop usando sintaxis tipo C

La segunda forma del ciclo for es similar al ciclo for en el lenguaje de programación "C", que tiene tres expresiones (inicialización, condición y actualización).

for (( expr1; expr2; expr3 ))
do
 command1
 command2
 ..
done

En el bash anterior para la sintaxis de comandos,

  • Antes de la primera iteración, se evalúa expr1. Esto generalmente se usa para inicializar variables para el ciclo.
  • Todas las sentencias entre do y done se ejecutan repetidamente hasta que el valor de expr2 sea VERDADERO.
  • Después de cada iteración del bucle, se evalúa expr3. Esto generalmente se usa para incrementar un contador de bucle.

Los siguientes 12 ejemplos muestran cómo golpear bucles for de diferentes maneras.

1. Valores estáticos para la lista después de la palabra clave "in"

En el siguiente ejemplo, la lista de valores (lunes, martes, miércoles, jueves y viernes) se proporciona directamente después de la palabra clave "in" en el ciclo bash for.

$ cat for1.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Precaución: La lista de valores no debe estar separada por comas (lunes, martes, miércoles, jueves, viernes). La coma será tratada como parte del valor. es decir, en lugar de "Lun", utilizará "Lun" como valor, como se muestra en el siguiente ejemplo.

$ cat for1-wrong1.sh
i=1
for day in Mon, Tue, Wed, Thu, Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong1.sh
Weekday 1 : Mon,
Weekday 2 : Tue,
Weekday 3 : Wed,
Weekday 4 : Thu,
Weekday 5 : Fri

Precaución: La lista de valores no debe estar entre comillas dobles. ("Lun Mar Mier Jue Vie"). Si lo encierra entre comillas dobles, se tratará como un valor único (en lugar de 5 valores diferentes), como se muestra en el siguiente ejemplo.

$ cat for1-wrong2.sh
i=1
for day in "Mon Tue Wed Thu Fri"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong2.sh
Weekday 1 : Mon Tue Wed Thu Fri

2. Variable para la lista después de la palabra clave "in"

En lugar de proporcionar los valores directamente en el bucle for, puede almacenar los valores en una variable y usar la variable en el bucle for después de la palabra clave "in", como se muestra en el siguiente ejemplo.

$ cat for2.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Precaución :Como práctica recomendada, siempre debe citar las variables de bash cuando las refiera. Hay pocas excepciones a esta regla de mejores prácticas. Este es uno de ellos. Si escribe entre comillas dobles la variable en este bucle for, la lista de valores se tratará como un valor único. Mucha gente cae en esta trampa. Tenga cuidado y no utilice comillas dobles en su variable en el ciclo for.

$ cat for2-wrong.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in "$weekdays"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2-wrong.sh
Weekday 1 : Mon Tue Wed Thu Fri

3. No especifique la lista; obténgalo de los parámetros posicionales

Si no especifica la palabra clave "in" seguida de una lista de valores en el bash for loop, utilizará los parámetros posicionales (es decir, los argumentos que se pasan al script de shell).

$ cat for3.sh
i=1
for day
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3.sh Mon Tue Wed Thu Fri
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Precaución: Tenga cuidado si utiliza este método. No debe incluir la palabra clave "in" en el bucle for. Si deja la palabra clave "in" sin ningún valor, no utilizará el parámetro posicional como se muestra a continuación. No entrará en el bucle. es decir, for loop nunca se ejecutará como se muestra en el siguiente ejemplo.

$ cat for3-wrong.sh
i=1
for day in
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3-wrong.sh Mon Tue Wed Thu Fri

Nota :consulte nuestro artículo anterior para obtener más información sobre los parámetros posicionales de bash.

4. Salida del comando Unix como valores de lista después de la palabra clave "in"

Puede utilizar la salida de cualquier comando de UNIX/Linux como lista de valores para el bucle for encerrando el comando entre comillas invertidas `` como se muestra a continuación.

$ cat for4.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
 echo "Username $((i++)) : $username"
done

$ ./for4.sh
Username 1 : ramesh
Username 2 : john
Username 3 : preeti
Username 4 : jason
..

5. Recorre archivos y directorios en un bucle for

Para recorrer archivos y directorios en un directorio específico, solo haga cd en ese directorio y escriba * en el bucle for como se muestra a continuación.

El siguiente ejemplo recorrerá todos los archivos y directorios en su directorio de inicio.

$ cat for5.sh
i=1
cd ~
for item in *
do
 echo "Item $((i++)) : $item"
done

$ ./for5.sh
Item 1 : positional-parameters.sh
Item 2 : backup.sh
Item 3 : emp-report.awk
Item 4 : item-list.sed
Item 5 : employee.db
Item 8 : storage
Item 9 : downloads

El uso de * en bash for loop es similar al archivo globbing que usamos en la línea de comandos de Linux cuando usamos el comando ls (y otros comandos).

Por ejemplo, lo siguiente mostrará todos los archivos y directorios en su directorio de inicio. Este es el concepto que se utiliza en el ejemplo anterior de for5.sh.

cd ~
ls *

A continuación, se mostrarán todos los archivos *.conf que comienzan con a, b o c o d en el directorio /etc.

$ ls -1 /etc/[abcd]*.conf
/etc/asound.conf
/etc/autofs_ldap_auth.conf
/etc/cas.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/dracut.conf

El mismo argumento que se usa en el comando ls anterior, se puede usar en un bash for loop, como se muestra en el ejemplo a continuación.

$ cat for5-1.sh
i=1
for file in /etc/[abcd]*.conf
do
 echo "File $((i++)) : $file"
done

$ ./for5-1.sh
File 1 : /etc/asound.conf
File 2 : /etc/autofs_ldap_auth.conf
File 3 : /etc/cas.conf
File 4 : /etc/cgconfig.conf
File 5 : /etc/cgrules.conf
File 6 : /etc/dracut.conf

6. Salir del bucle for

Puede salir de un bucle for usando el comando 'romper' como se muestra a continuación.

$ cat for6.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
 if [ $i -eq 3 ]; then
   break;
 fi
done

$ ./for6.sh
Weekday 1 : Mon
Weekday 2 : Tue

7. Continuar desde la parte superior del bucle for

Bajo ciertas condiciones, puede ignorar el resto de los comandos en el ciclo for y continuar el ciclo desde arriba nuevamente (para el siguiente valor en la lista), usando el comando continuar como se muestra a continuación.

El siguiente ejemplo agrega "(FIN DE SEMANA)" a los sábados y domingos, y "(día de la semana)" al resto de los días.

$ cat for7.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
 echo -n "Day $((i++)) : $day"
 if [ $i -eq 7 -o $i -eq 8 ]; then
   echo " (WEEKEND)"
   continue;
 fi
 echo " (weekday)"
done

$ ./for7.sh
Day 1 : Mon (weekday)
Day 2 : Tue (weekday)
Day 3 : Wed (weekday)
Day 4 : Thu (weekday)
Day 5 : Fri (weekday)
Day 6 : Sat (WEEKEND)
Day 7 : Sun (WEEKEND)

8. Bash for loop usando la sintaxis del programa C

Este ejemplo utiliza el segundo método de bash for loop, que es similar a la sintaxis de C for loop. El siguiente ejemplo genera 5 números aleatorios utilizando el bucle for bash estilo C.

$ cat for8.sh
for (( i=1; i <= 5; i++ ))
do
 echo "Random number $i: $RANDOM"
done

$ ./for8.sh
Random number 1: 23320
Random number 2: 5070
Random number 3: 15202
Random number 4: 23861
Random number 5: 23435

9. Infinito Bash for loop

Cuando no proporciona el inicio, la condición y el incremento en el ciclo for de estilo C de bash, se convertirá en un ciclo infinito. Debe presionar Ctrl-C para detener el ciclo.

$ cat for9.sh
i=1;
for (( ; ; ))
do
   sleep $i
   echo "Number: $((i++))"
done

Como dijimos anteriormente, presione Ctrl-C para salir de este bash infinite for loop ejemplo.

$ ./for9.sh
Number: 1
Number: 2
Number: 3

10. Usando una coma en el ciclo bash C-style for

En el ciclo bash c-style, además de incrementar el valor que se usa en la condición, también puede incrementar algún otro valor como se muestra a continuación.

En la sección de inicialización y la sección de incremento del bucle for de estilo C de bash, puede tener varios valores separándolos con una coma como se muestra a continuación.

El siguiente bucle for se ejecuta un total de 5 veces, utilizando la variable i. Sin embargo, la variable j comienza con 5 y se incrementa en 5 cada vez que se ejecuta el ciclo.

$ cat for10.sh
for ((i=1, j=10; i <= 5 ; i++, j=j+5))
do
 echo "Number $i: $j"
done

$ ./for10.sh
Number 1: 10
Number 2: 15
Number 3: 20
Number 4: 25
Number 5: 30

11. Rango de números después de la palabra clave "en"

Puede recorrer usando el rango de números en el bucle for "in" usando la expansión de llaves.

El siguiente ejemplo recorre 10 veces utilizando los valores del 1 al 10.

$ cat for11.sh
for num in {1..10}
do
 echo "Number: $num"
done

$ ./for11.sh
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
...

12. Rango de números con incrementos después de la palabra clave "in"

El siguiente ejemplo se repite 5 veces usando los valores del 1 al 10, con un incremento de 2. Es decir, comienza con 1 y sigue aumentando de 2 en 2 hasta llegar a 10.

$ cat for12.sh
for num in {1..10..2}
do
 echo "Number: $num"
done

$ ./for12.sh
Number: 1
Number: 3
Number: 5
Number: 7
Number: 9

PD: No olvide marcar este artículo como favorito para futuras referencias.


Linux
  1. Bash For Loop Guía y ejemplos

  2. Las 5 mejores extensiones de GNOME Shell para su escritorio Linux

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

  4. Ejemplos de ciclos for y while de Bash

  5. Manteniéndote al tanto – Bash For, While, Until Ejemplos de bucles

Bash For Loops con ejemplos

Shell Scripting para principiantes:cómo escribir Bash Scripts en Linux

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

Bash Shell PS1:10 ejemplos para hacer que su Linux sea tan rápido como Angelina Jolie

Tutorial de introducción a Bash Scripting con 5 ejemplos prácticos

Bash Script for Loop explicado con ejemplos