9 ejemplos de bucles for en Linux Bash Scripts

El versátil Bashforloop hace mucho más que dar vueltas un número determinado de veces. Describimos sus muchas variantes para que pueda usarlas con éxito en sus propios scripts de Linux.

El bucle para

Todos los lenguajes de secuencias de comandos y programación tienen alguna forma de manejar los bucles. Un bucle es una sección de código que desea ejecutar repetidamente. En lugar de escribir el mismo conjunto de instrucciones en su secuencia de comandos, una y otra vez, un ciclo repetirá una sección de código una y otra vez por usted.

la fiestaforbucle es muy flexible. Puede funcionar con números, palabras, matrices, variables de línea de comandos o la salida de otros comandos. Estos se utilizan en el encabezado del bucle. El encabezado dicta con qué está trabajando el bucle: números o cadenas, por ejemplo. example— y cuál es la condición final que detendrá el bucle.

El cuerpo del bucle contiene el código que desea que se repita. Contiene lo que quieres que haga el bucle. El cuerpo del ciclo puede contener cualquier comando de script válido.

Se utiliza una variable llamada contador de bucle o iterador para recorrer un rango de valores o una lista de elementos de datos. Para cada bucle, el iterador toma el valor del siguiente número, cadena o cualquier tipo de datos sobre el que itera el bucle. Esto permite que el bucle funcione con los valores de cada uno de los elementos de datos, o incluso en algunos casos, para manipular los elementos de datos en sí.

Simple para bucles

Si está buscando escribir su primer ciclo for, estos ejemplos simples lo ayudarán a comenzar.

bucles para usar listas numéricas

Puedes ejecutar unforbucle en la línea de comando. Este comando crea y ejecuta un simpleforcírculo. El iterador es una variable llamadai. vamos a asignariser cada uno de los valores en la lista de números, a su vez. El cuerpo del bucle imprimirá ese valor en la ventana de la terminal. La condición que termina este ciclo es cuandoiha iterado en toda la lista de números.

for i in 1 2 3 4 5; do echo $i; done

Es importante señalar aquí que la variableiaumenta en uno cada vez que el bucle gira, pero eso se debe a que la lista de números aumenta en uno cada vez.

Esta lista de números comienza en 3 y sube en pasos de dos, luego salta arbitrariamente a 44.

for i in 3 5 7 9 11 44; do echo $i; done

un ciclo for contando a través de una lista no secuencial de números

No hace ninguna diferencia para elforcírculo. Comienza en un extremo de la lista y usa cada valor por turno, hasta que se hayan usado todos los valores de la lista.

Tampoco es necesario que los números estén en orden ascendente. Pueden estar en cualquier orden.

for i in 3 43 44 11 9; do echo $i; done

un bucle for contando a través de una lista desordenada de números

para bucles usando Word Liza

Podemos hacer lo mismo fácilmente con las palabras. Copie el texto del guión en un editor y guárdelo como “word-list.sh”.

#!/bin/bash

for word in This is a sequence of words
do 
  echo $word
done

Tendrás que usarchmodpara hacer que el script sea ejecutable y cualquier otro script que copie de este artículo. Simplemente sustituya el nombre del script cada vez que use elchmoddominio.

chmod +x word-list.sh

Haciendo un script ejecutable con chmod

Ejecutemos el script.

./word-list.sh

Un bucle for trabajando a través de una lista de palabras

Tal como lo hizo con los números, el iterador, en este exampleLa variableword: se abre camino a través de la lista de elementos de datos hasta que llega al final de la lista. El cuerpo del ciclo accede al valor en elwordvariable y así se procesa cada palabra de la lista.

para bucles con rangos de números

si quisieras unforbucle para ejecutarse 100 veces, sería bastante tedioso tener que escribir una secuencia de 100 números en el encabezado del bucle. Los rangos de números le permiten especificar solo el primer y el último número.

Es el script "number-range.sh".

#!/bin/bash

for i in {1..10}
do
  echo "Loop spin:" $i
done

El rango de números se define entre corchetes “{}” con dos puntos “..” separando los números que comienzan y terminan el rango. Asegúrese de no incluir ningún espacio en blanco en la definición del rango.

Así es como funciona:

./number-range.sh

Un bucle for usando un rango de números

Puede incluir otro número que defina el tamaño de paso que debe usar el iterador para recorrer los números en el rango. Este script, “number-range2.sh” utilizará un rango de 0 a 32 y un tamaño de paso de 4.

#!/bin/bash

for i in {0..32..4}
do
  echo "Loop spin:" $i
done

El iterador recorre el rango de números en saltos de cuatro.

./number-range2.sh

Un bucle for usando un paso de iterador de 4

para bucles utilizando nombres de archivo

Debido a que podemos procesar listas de palabras, podemos hacer que nuestros scripts funcionen con nombres de archivos. Este script se llama “filenames.sh”.

#!/bin/bash

for file in word-list.sh number-range.sh number-range2.sh filenames.sh
do
  ls -lh "$file"
done

Sería bastante inútil tener un script que solo haga lo quelspuede hacer, pero demuestra cómo acceder a los nombres de archivo dentro del cuerpo del ciclo.

./filenames.sh

Un bucle for usando una lista de nombres de archivo

De manera similar al uso del rango de números, podemos usar un patrón de archivo en el encabezado del bucle para especificar los archivos que queremos procesar. Esto evita tener que escribir mucho y significa que no necesitamos saber de antemano los nombres de los archivos.

Este script se llama “filenames2.sh”. Hemos reemplazado la lista de nombres de archivo con el patrón de nombre de archivo “*.sh” para que el script informe sobre todos los archivos de script en el directorio actual.

#!/bin/bash

for file in *.sh
do
  ls -lh "$file"
done

Aquí está la salida.

./filenames2.sh

Un bucle for usando un patrón de archivo de *.sh

bucles for mediante parámetros de línea de comandos

Podemos agregar algo más de flexibilidad al pasar el patrón de nombre de archivo en la línea de comando. los$*La variable representa todos los parámetros de la línea de comando pasados al script.

Esto es “nombresdearchivo3.sh”.

#!/bin/bash

for file in $*
do
  ls -lh "$file"
done

Le pediremos nombres de archivo que comiencen con “n” y tengan una extensión SH.

./filenames3.sh n*.sh

Un bucle for que toma un patrón de archivo como parámetro de línea de comando

También podemos pasar en más de un patrón a la vez.

./filenames3.sh n*.sh .bashrc

Un bucle for que toma un patrón de archivo y los parámetros de línea de comando de un nombre de archivo

La variable iteradorafiletoma el valor de cada uno de los parámetros de la línea de comando. Los patrones de nombre de archivo se expanden y todos los nombres de archivo se procesan en el cuerpo del bucle.

Cómo trabajar con variables en Bash

Tipo C para bucles

Bash admite el ciclo for clásico de tres términos, como los que se encuentran en el lenguaje de programación C. Se denominan bucles for de tres términos porque hay tres términos en el encabezado del bucle.

  • El valor inicial del iterador de bucle.
  • La prueba de si el bucle continúa o finaliza.
  • El incremento, o disminución, del iterador.

Es el script es "c-like.sh".

el iteradorIse establece en 1 al comienzo del ciclo, y el ciclo se ejecutará mientras la declaración ”i<=10” es verdad. Tan pronto comoillega a 11, elforel bucle se detendrá. El iterador se incrementa en uno, cada revolución del ciclo.

#!/bin/bash

for (( i=1; i<=10; i++ ))
do 
  echo "Loop number:" $i
done

Ejecutemos este script.

./c-like.sh

Un bucle for de tres términos o similar a C

El tipo Cforbucle permite la fácil creación deforbucles que tienen requisitos ligeramente extraños. Este ciclo comienza en 15 y cuenta hacia atrás en pasos de 3. Esto es “c-like2.sh”

#!/bin/bash

for (( i=15; i>0; i-=3 ))
do 
  echo "Loop number:" $i
done

Cuando lo ejecutamos, debe saltar hacia atrás en pasos de tres.

./c-like2.sh

Un ciclo tipo C para contar hacia atrás

Infinito para bucles

También puede utilizar este formato deforbucle para crear un bucle infinito. Todo lo que necesita hacer es eliminar todos los elementos del encabezado del bucle, así. Esto es “infinito.sh”.

#!/bin/bash

for (( ; ; ))
do
  echo "Press Ctrl+C to stop..."
  sleep 1
done

Deberá presionar Ctrl+C para detener el ciclo.

./infinite.sh

Un bucle for infinito tipo C

para bucles usando Word arreglos

Podemos iterar fácilmente a través de una matriz de palabras. Necesitamos proporcionar el nombre de la matriz en el encabezado del bucle, y el iterador recorrerá todas las entradas de la matriz. Esto es “word-array.sh”.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  echo $distro
done

Todas las distribuciones están listadas para nosotros.

./word-array.sh

Un bucle for usando una matriz de palabras

El comando continuar

Si desea que el ciclo pase por encima de una entrada en particular, pruebe si el iterador coincide con esa entrada y use elcontinuedominio. loscontinueEl comando abandona el giro actual del bucle. Incrementa el iterador y comienza el siguiente giro del ciclo, suponiendo que la entrada que desea omitir no es el último elemento de la lista.

Este es “word-array2.sh”. Pasa por encima de la entrada de la matriz “Arco”, pero procesa todos los demás miembros de la matriz.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  if [[ "$distro" == "Arch" ]] ;
    then
    continue
  fi
  echo $distro
done

“Arco” no aparece en la ventana del terminal.

./word-array2.sh

Un bucle for salta una entrada en una matriz de palabras debido al comando continuar

El comando de ruptura

losbreakEl comando sale del bucle y evita que se procese más.

Este es “word-array3.sh”. Es lo mismo que el script anterior concontinuereemplazado porbreak.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  if [[ "$distro" == "Arch" ]] ;
    then
    break
  fi
  echo $distro
done

Cuando el iterador contiene “Arch”, el ciclo for abandona cualquier procesamiento adicional.

./word-array3.sh

Un bucle for que abandona el procesamiento posterior debido al comando break

bucles for utilizando matrices asociativas

En Bash 4 y versiones posteriores, las matrices asociativas le permiten crear listas de pares clave-valor que se pueden buscar por clave o por valor. Debido a la relación bidireccional entre la clave y el valor, también se denominan diccionarios de datos.

Podemos iterar a través de una matriz asociativa usando unforcírculo. Este script es “asociative.sh”. Define una matriz asociativa con cuatro entradas, una para cada uno de “perro”, “gato”, “robin” y “humano”. Estas son las claves. Los valores son el número (predeterminado) de patas que cada uno tiene.

#!/bin/bash

declare -A animals=( [dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged )

for legs in ${!animals[@]}
do
  if [ ${animals[$legs]} == "Two-legged" ]; then 
    echo ${legs}
  fi
done

El iterador se llamalegs. Tenga en cuenta que el encabezado del bucle contiene un “!” punto de exclamación. Esto no actúa como el operador lógico NOT, es parte de la sintaxis de matriz asociativa. Se requiere para buscar a través de la matriz.

El cuerpo del bucle realiza una prueba de comparación de cadenas. Si el valor del miembro de la matriz es “de dos patas”, imprime el valor de la clave en la ventana del terminal. Cuando lo ejecutamos, el script imprime las criaturas de dos patas.

./associative.sh

Usar un bucle for para extraer elementos de una matriz asociativa

Iterando sobre la salida de los comandos

Si tiene un comando o secuencia de comandos que producen una lista de algo, como nombres de archivo, puede iterarlos con unforcírculo. Debe tener cuidado con las expansiones inesperadas de nombres de archivo, pero en casos simples está bien.

Este script es "command.sh". EE.UUlsywcpara proporcionar una lista ordenada de nombres de archivos de secuencias de comandos, junto con sus recuentos de líneas, palabras y bytes.

#!/bin/bash

for i in $(ls *.sh | sort);
do 
  echo $(wc $i)
done

Cuando lo ejecutamos, obtenemos las estadísticas de cada archivo, con los archivos enumerados en orden alfabético.

./command.sh

Uso de un bucle for para iterar sobre la salida de dos comandos canalizados

El Deslumbrante para Loop

losforloop es una herramienta de secuencias de comandos versátil y fácil de entender. Pero tan flexible como es, no olvide que existen otros bucles por una razón. No se deje deslumbrar pensando en elforloop es todo lo que necesitarás.

loswhilebucle, para examplees mucho más adecuado para ciertas cosas que elforbucle, como leer líneas de un archivo.

Escribir buenos guiones significa utilizar la herramienta más adecuada para la tarea en cuestión. losforloop es una gran herramienta para tener en tu caja de herramientas de trucos.

Actualizaciones del boletín

Ingrese su dirección de correo electrónico a continuación para suscribirse a nuestro boletín