9 ejemplos de bucles for en Linux Bash Scripts
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.
la fiesta for
bucle 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 encabezamiento 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.
los cuerpo del bucle contiene el código que desea que se repita. Contiene lo que quieres que el bucle hacer. El cuerpo del ciclo puede contener cualquier comando de script válido.
Una variable llamada contador de bucle o iterador se utiliza 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 ciclo funcione con los valores de cada uno de los elementos de datos por turno, o incluso, en algunos casos, 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
Puedes ejecutar un for
bucle en la línea de comando. Este comando crea y ejecuta un simple for
círculo. El iterador es una variable llamada i
. vamos a asignar i
ser cada uno de los valores de 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 cuando i
ha 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 variable i
aumenta 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
No hace ninguna diferencia para el for
cí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
bucles for utilizando 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 for word in This is a sequence of words do echo $word done
Tendrás que 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 chmod
dominio.
chmod +x word-list.sh
Ejecutemos el script.
./word-list.sh
Tal como lo hizo con los números, el iterador, en este ejemplo, la variable word
: avanza por la lista de elementos de datos hasta que llega al final de la lista. El cuerpo del ciclo accede al valor en el word
variable y así se procesa cada palabra de la lista.
para bucles con rangos de números
si quisieras un for
bucle 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.
Este script es "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 periodos"..
"Separar 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
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
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 que ls
puede hacer, pero demuestra cómo acceder a los nombres de archivo dentro del cuerpo del ciclo.
./filenames.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 for file in *.sh do ls -lh "$file" done
Aquí está la salida.
./filenames2.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
También podemos pasar en más de un patrón a la vez.
./filenames3.sh n*.sh .bashrc
La variable iteradora file
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 decremento) 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 instrucción " i<=10
"Es verdad. Tan pronto como i
llega a 11, el for
el 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
El tipo C for
bucle permite la fácil creación de for
bucles 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
Infinito para bucles
También puede utilizar este formato de for
bucle 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
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. Este 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
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 continue
dominio. los continue
El comando abandona el Actual giro 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
El comando de ruptura
los break
El comando 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 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
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 for
cí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 tiene cada uno.
#!/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 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.
./associative.sh
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 un for
círculo. Debe tener cuidado con las expansiones inesperadas de nombres de archivo, pero en casos simples está bien.
Este script es "command.sh". usa 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 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
El Deslumbrante para Loop
los for
loop 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 el for
loop es todo lo que necesitarás.
los while
loop, por ejemplo, es mucho más adecuado para ciertas cosas que el for
bucle, como leer líneas de un archivo.
Escribir buenos guiones significa utilizar la herramienta más adecuada para la tarea en cuestión. los for
loop es una gran herramienta para tener en tu caja de herramientas de trucos.
Descubre más contenido