El versátil Bashfor
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 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 fiestafor
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 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 unfor
bucle en la línea de comando. Este comando crea y ejecuta un simplefor
círculo. El iterador es una variable llamadai
. vamos a asignari
ser 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 cuandoi
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 variablei
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 elfor
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
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 usarchmod
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 elchmod
dominio.
chmod +x word-list.sh
Ejecutemos el script.
./word-list.sh
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 elword
variable y así se procesa cada palabra de la lista.
para bucles con rangos de números
si quisieras unfor
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.
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
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 quels
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 iteradorafile
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.
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 iteradorI
se establece en 1 al comienzo del ciclo, y el ciclo se ejecutará mientras la declaración ”i<=10
” es verdad. Tan pronto comoi
llega a 11, elfor
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 Cfor
bucle permite la fácil creación defor
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 defor
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
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
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 elcontinue
dominio. loscontinue
El 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
El comando de ruptura
losbreak
El comando sale del bucle y evita que se procese más.
Este es “word-array3.sh”. Es lo mismo que el script anterior concontinue
reemplazado 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
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 unfor
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 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
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 unfor
círculo. Debe tener cuidado con las expansiones inesperadas de nombres de archivo, pero en casos simples está bien.
Este script es "command.sh". EE.UUls
ywc
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
losfor
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 elfor
loop es todo lo que necesitarás.
loswhile
bucle, para examplees mucho más adecuado para ciertas cosas que elfor
bucle, como leer líneas de un archivo.
Escribir buenos guiones significa utilizar la herramienta más adecuada para la tarea en cuestión. losfor
loop es una gran herramienta para tener en tu caja de herramientas de trucos.