9 ejemplos de bucles for en Linux Bash Scripts
Publicado: 2022-08-19 El versátil Bash for
loop 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 for
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.
El bucle for
Bash 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) 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 desea que haga el bucle. El cuerpo del bucle 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 for utilizando listas numéricas
Puede ejecutar un bucle for
en la línea de comando. Este comando crea y ejecuta un bucle for
simple. El iterador es una variable llamada i
. Vamos a asignar i
para que sea 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 finaliza este ciclo es cuando i
iterado en toda la lista de números.
para i en 1 2 3 4 5; hacer eco $i; hecho
Es importante señalar aquí que la variable i
aumenta en uno cada vez que el ciclo 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.
para i en 3 5 7 9 11 44; hacer eco $i; hecho
No hace ninguna diferencia para el bucle for
. 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.
para i en 3 43 44 11 9; hacer eco $i; hecho
bucles for usando listas de palabras
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 para palabra en Esta es una secuencia de palabras hacer echo $palabra hecho
Deberá usar chmod
para 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 el comando chmod
.
chmod +x lista-de-palabras.sh
Ejecutemos el script.
./lista-de-palabras.sh
Tal como lo hizo con los números, el iterador, en este ejemplo, la word
variable, avanza a través de la lista de elementos de datos hasta que llega al final de la lista. El cuerpo del bucle accede al valor de la word
variable y, por lo tanto, se procesa cada palabra de la lista.
para bucles con rangos de números
Si quisiera que un ciclo for
se ejecutara 100 veces, sería bastante tedioso tener que escribir una secuencia de 100 números en el encabezado del ciclo. Los rangos de números le permiten especificar solo el primer y el último número.
Este script es "number-range.sh".
#!/bin/bash para i en {1..10} hacer echo "Girar bucle:" $i hecho
El rango de números se define entre corchetes " {}
" con dos puntos " ..
" que separan 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:
./rango-de-números.sh
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 para i en {0..32..4} hacer echo "Girar bucle:" $i hecho
El iterador recorre el rango de números en saltos de cuatro.
./número-rango2.sh
para bucles utilizando nombres de archivo
Debido a que podemos procesar listas de palabras, podemos hacer que nuestros scripts funcionen con nombres de archivo. Este script se llama "filenames.sh".
#!/bin/bash para el archivo en word-list.sh number-range.sh number-range2.sh filenames.sh hacer ls -lh "$archivo" hecho
Sería bastante inútil tener un script que solo haga lo que ls
puede hacer, pero demuestra cómo acceder a los nombres de archivo dentro del cuerpo del bucle.
./nombresdearchivo.sh
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 para archivo en *.sh hacer ls -lh "$archivo" hecho
Aquí está la salida.
./nombresdearchivo2.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. La variable $*
representa todos los parámetros de la línea de comandos pasados al script.
Esto es "nombresdearchivo3.sh".
#!/bin/bash para archivo en $* hacer ls -lh "$archivo" hecho
Le pediremos nombres de archivo que comiencen con "n" y tengan una extensión SH.
./nombresdearchivo3.sh n*.sh
También podemos pasar en más de un patrón a la vez.
./nombresdearchivo3.sh n*.sh .bashrc
El file
de variables del iterador toma 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.
RELACIONADO: 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.
Este script es "c-like.sh".
El iterador I
se establece en 1 al comienzo del ciclo, y el ciclo se ejecutará mientras la afirmación " i<=10
" sea verdadera. Tan pronto como i
a 11, el bucle for
se detendrá. El iterador se incrementa en uno, cada revolución del ciclo.
#!/bin/bash para (( i=1; i<=10; i++ )) hacer echo "Número de bucle:" $i hecho
Ejecutemos este script.
./c-like.sh
El bucle for
tipo C permite la creación fácil de bucles for
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 para (( i=15; i>0; i-=3 )) hacer echo "Número de bucle:" $i hecho
Cuando lo ejecutamos, debe saltar hacia atrás en pasos de tres.
./c-like2.sh
Infinito para bucles
También puede usar este formato de bucle for
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 por (( ; ; )) hacer echo "Presione Ctrl+C para detener..." dormir 1 hecho
Deberá presionar Ctrl+C para detener el ciclo.
./infinito.sh
bucles for utilizando matrices de palabras
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 distribuciones = ("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") para distribución en $distribuciones hacer eco $ distribución hecho
Todas las distribuciones están listadas para nosotros.
./palabra-matriz.sh
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 el comando continue
. El comando continue
abandona el giro actual del ciclo. 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 distribuciones = ("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") para distribución en $distribuciones hacer if [[ "$distro" == "Arco" ]] ; después Seguir fi eco $ distribución hecho
"Arco" no aparece en la ventana del terminal.
./palabra-matriz2.sh
El comando de ruptura
El comando break
sale del bucle y evita que se procese más.
Este es "word-array3.sh". Es lo mismo que el script anterior con continue
reemplazado por break
.
#!/bin/bash distribuciones = ("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") para distribución en $distribuciones hacer if [[ "$distro" == "Arco" ]] ; después descanso fi eco $ distribución hecho
Cuando el iterador contiene "Arch", el ciclo for abandona cualquier procesamiento adicional.
./palabra-matriz3.sh
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 un bucle for
. 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 animales=( [perro]=Cuatro patas [gato]=Cuatro patas [robin]=Dos patas [humano]=Dos patas) para piernas en ${!animals[@]} hacer if [ ${animales[$piernas]} == "Dos patas" ]; después echo ${piernas} fi hecho
El iterador se llama legs
. Tenga en cuenta que el encabezado del ciclo 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.
./asociativo.sh
Iterando sobre la salida de los comandos
Si tiene un comando o una secuencia de comandos que producen una lista de algo, como nombres de archivo, puede iterar a través de ellos con un bucle for
. Debe tener cuidado con las expansiones inesperadas de nombres de archivo, pero en casos simples está bien.
Este script es "command.sh". utiliza ls
y wc
para proporcionar una lista ordenada de nombres de archivos de secuencias de comandos, junto con sus recuentos de líneas, palabras y bytes.
#!/bin/bash para i en $(ls *.sh | ordenar); hacer echo $(wc $i) hecho
Cuando lo ejecutamos, obtenemos las estadísticas de cada archivo, con los archivos enumerados en orden alfabético.
./comando.sh
El Deslumbrante para Loop
El bucle for
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 que el ciclo for
es todo lo que necesitará.
El ciclo while
, por ejemplo, es mucho más adecuado para ciertas cosas que el ciclo for
, como leer líneas de un archivo.
Escribir buenos guiones significa utilizar la herramienta más adecuada para la tarea en cuestión. El ciclo for
es una gran herramienta para tener en tu caja de herramientas de trucos.