Bucle for anidado en Bash
En este tutorial, discutiremos los bucles anidados en bash. Primero, discutiremos rápidamente las diferentes formulaciones de bucle for disponibles en bash. A continuación, discutiremos el bucle for anidado con ejemplos.
Variaciones del bucle for en Bash
En primer lugar, veamos la sintaxis del bucle for en bash:
for var in something
do
command
done
En esta sintaxis, el nombre de la variable es elección del usuario. Hay múltiples opciones para algo, que discutiremos en breve.
Podemos escribir cualquier número de comandos dentro del cuerpo for. Múltiples variaciones de bucle for están disponibles en bash; veremos rápidamente algunos a continuación.
for en el rango de números
Podemos especificar una lista de números con un bucle for y podemos iterar sobre esos números uno por uno, como se muestra en el siguiente ejemplo:
for i in 1 3 8
do
echo $i
done
El bucle iterará en la lista de valores dada (es decir, 1 3 8). En este ejemplo particular, la salida será:
1
3
8
for en la lista de valores
Podemos definir una lista de valores e iterar sobre la lista de la siguiente manera:
x=(1 3 8)
for i in ${x[@]}
do
echo $i
done
El resultado de este código será el mismo que el del ejemplo anterior. En la sentencia del bucle for, {x[@]} representa: para cada elemento de la lista x.
for en el rango de una secuencia
Podemos dar un rango de valores con un número inicial, seguido de un punto doble (..), seguido de un número final. Del mismo modo, podemos poner otro par de puntos seguidos de un paso.
Por ejemplo, veamos las siguientes dos formulaciones de bucle de ejemplo:
for i in {1..3}
do
echo $i
done
echo "----------------------"
for i in {1..3..2}
do
echo $i
done
La salida de este código será:
1
2
3
----------------------
1
3
for en cadena con palabras
Podemos definir una lista de palabras en una cadena separadas por espacios e iterar sobre las palabras en la cadena de la siguiente manera:
names="Asim Babar Munir Ali"
for name in $names
do
echo $name
done
La salida de este código recibirá nombres en líneas separadas de la siguiente manera.
Asim
Babar
Munir
Ali
C-Estilo para Expresión
Podemos dar una expresión en el bucle for similar al for en lenguaje C. Ver el ejemplo:
for ((i=1;i<=5;i++))
do
echo $i
done
Producirá la siguiente salida:
1
2
3
4
5
Uso de la instrucción continuar en el bucle for
Podemos poner algunas condiciones en el cuerpo del bucle for, seguidas de una instrucción continuar para omitir el siguiente cuerpo del bucle. Ver el ejemplo:
for ((i=1;i<=5;i++))
do
if [ $i == 3 ]
then
continue
fi
echo $i
done
Debido a la condición if, el bucle saltará el comando echo para el valor 3; por lo tanto, la salida será: 1 2 4 5.
Bucle sobre argumentos de línea de comando
Podemos dar argumentos de línea de comandos a nuestro script bash y ejecutar un bucle for sobre los argumentos separados por espacios. Ver el ejemplo:
for i in $@
do
echo "Script arg is $i"
done
En la primera línea, el símbolo $@ representa una lista de argumentos separados por espacios. Vea el resultado de este ejemplo:
bash myscript.sh 13 28
Script arg is 13
Script arg is 28
Bucle sobre la salida del comando
Podemos ejecutar el bucle for sobre la salida de algún comando. Ver el ejemplo:
for f in $(ls)
do
echo "**** $f *****"
done
Este script tomará la salida del comando ls e iterará sobre los valores. Ver salida de ejemplo:
**** first.c *****
**** second.c *****
**** third.c *****
Bucle sobre secuencia variable
También podemos ejecutar alguna entrada basada en alguna variable en tiempo de ejecución. Para esto, podemos usar seq 1 1 $n, donde n puede ser una variable. Ver el ejemplo:
n=4
for i in $(seq 1 1 $n)
do
echo -n $i
echo " "
done
Aquí, he asignado el valor 4 a una variable, mientras que puede ser un conteo, como el conteo de palabras, etc. Ver salida de ejemplo:
1
2
3
4
Bucle for anidado en Bash
Tenemos una variedad de bucles for anidados en bash. De acuerdo con nuestros requisitos, podemos crear varias variaciones de los bucles for anidados (es decir, combinando las formulaciones de bucle for disponibles).
Aquí, veremos múltiples ejemplos con la salida:
-
Imprime los primeros diez múltiplos de los primeros cinco enteros positivos.
for number in {1..5} do for n in {1..10} do echo -n $((number*$n)) echo -n " " done echo "" doneLa salida de este código es:
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 -
Imprime los primeros 10 múltiplos de la lista de enteros.
for number in 2 5 9 do for n in {1..10} do echo -n $((number*$n)) echo -n " " done echo "" doneLa salida de este código es:
2 4 6 8 10 12 14 16 18 20 5 10 15 20 25 30 35 40 45 50 9 18 27 36 45 54 63 72 81 90 -
Imprimir números en patrón de triángulo.
for number in {1..5} do for n in $(seq 1 1 $number) do echo -n $n done echo "" doneLa salida de este código es:
1 12 123 1234 12345Podemos obtener varias líneas del argumento de la línea de comando para imprimir un patrón de tamaño variable. Ver código:
for number in $(seq 1 1 $@) do for n in $(seq 1 1 $number) do echo -n $n done echo "" doneLa salida del comando
bash pattern2.sh 6es:1 12 123 1234 12345 123456Donde
patter2.shes el nombre de este script y6es el argumento de la línea de comandos. -
Imprima un patrón de triángulo con un asterisco (
*) o cualquier otro carácter.for number in $(seq 1 1 $@) do for n in $(seq 1 1 $number) do echo -n "*" done echo "" doneLa salida del código con el argumento
4es:* ** *** **** -
Imprima mensajes varias veces (para enfatizar).
messages="Sea_is_rough Don't_go_too_far_in_the_sea Remain_in_the_group Don't_take_kids_inside" for i in 1 2 3 4 5 do for message in $messages do echo $message done echo "----------------------------------" doneLa salida de esto es:
Sea_is_rough Don't_go_too_far_in_the_sea Remain_in_the_group Don't_take_kids_inside ---------------------------------- Sea_is_rough Don't_go_too_far_in_the_sea Remain_in_the_group Don't_take_kids_inside ---------------------------------- Sea_is_rough Don't_go_too_far_in_the_sea Remain_in_the_group Don't_take_kids_inside ---------------------------------- Sea_is_rough Don't_go_too_far_in_the_sea Remain_in_the_group Don't_take_kids_inside ---------------------------------- Sea_is_rough Don't_go_too_far_in_the_sea Remain_in_the_group Don't_take_kids_inside ---------------------------------- -
Imprimir contando de 1 en adelante en una sola línea. Tienes que imprimir contando hasta la lista de argumentos de línea de comando.
for number in $@ do for i in $(seq 1 1 $number) do echo -n "$i " done echo "" doneLa salida de este código para
Bash counting.sh 4 5 8es:1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 7 8 -
Imprima múltiplos de 10 a 20, pero no imprima múltiplos de números primos en esta secuencia.
for number in $(seq 10 1 20) do if [[ $number == 11 || $number == 13 || $number == 17 || $number == 19 ]] then continue fi for n in {1..10} do echo -n $((number*$n)) echo -n " " done echo "" doneLa salida de este código es:
10 20 30 40 50 60 70 80 90 100 12 24 36 48 60 72 84 96 108 120 14 28 42 56 70 84 98 112 126 140 15 30 45 60 75 90 105 120 135 150 16 32 48 64 80 96 112 128 144 160 18 36 54 72 90 108 126 144 162 180 20 40 60 80 100 120 140 160 180 200
En conclusión, tenemos una variedad de bucles for anidados en bash. Por lo tanto, podemos usar combinaciones de las variaciones de bucle for disponibles según nuestros requisitos para completar la tarea.