Bucle for anidado en Bash

Abdul Mateen 8 octubre 2023
  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.