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 "" done
La 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 "" done
La 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 "" done
La salida de este código es:
1 12 123 1234 12345
Podemos 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 "" done
La salida del comando
bash pattern2.sh 6
es:1 12 123 1234 12345 123456
Donde
patter2.sh
es el nombre de este script y6
es 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 "" done
La salida del código con el argumento
4
es:* ** *** ****
-
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 "----------------------------------" done
La 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 "" done
La salida de este código para
Bash counting.sh 4 5 8
es: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 "" done
La 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.