Bucle for anidado en Bash

  1. Variaciones del bucle for en Bash
  2. Bucle for anidado en Bash
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 y 6 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.

¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete