Los Bucles, en programación, son uno de los pilares fundamentales en los cuales nos apoyamos a la hora de desarrollar cualquier tipo de aplicación, bien sea una web, una APP para Android o IOS, una aplicación de escritorio etc... En el siguiente artículo, os voy a enseñar como usar cada uno de los tipos de bucles que existen, acompañados de pequeños ejemplos...
Seguid leyendo si queréis aprender a realizar vuestros primeros scripts de Bash con Bucles o Loops...
Los bucles en Bash (y en cualquier otro lenguaje de programación) son sumamente importantes. En este pequeño y sencillo tutorial, os voy a enseñar como utilizar los bucles en bash con algún pequeño ejemplo y su sintaxis.
Los bucles nos permiten realizar una serie de acciones continuamente o hasta que una condición se cumpla o deje de cumplirse. Son sumamente útiles para operaciones donde hay que repetir n veces un tipo de acción en concreto.
Existen básicamente 3 tipos de bucles en Bash. Existen otros comandos que intervienen también en los bucles y que veremos de forma rápida a continuación.
Los bucles en programación, son sumamente importantes.
1.- ELEMENTOS NECESARIOS PARA ESTE TUTORIAL
Un equipo con GNU/Linux
2.- BUCLES WHILE
Posiblemente, uno de los bucles mas sencillos de entender y de trabajar con ellos es el bucle while. Lo que hace este bucle es, mientras que la expresión sea verdadera, se ejecutarán X líneas de código que queramos. La sintaxis de este bucle es la siguiente:
while [ <condición o expresión> ] do <comandos> done
En el siguiente ejemplo, podemos ver que, mientras la variable $contador sea menor o igual a 15, imprimiremos un mensaje por pantalla. Una vez que la variable tenga el valor 15, el bucle finalizará y el script imprimirá otro mensaje de finalización.
#!/bin/bash # Bucle básico While contador=1 while [ $contador -le 15 ] do echo "Este es el mensaje número" $contador ((contador++)) done echo "Bucle finalizado"
Si guardamos el código en un script, por ejemplo script_while.sh y lo ejecutamos (hay que darle permisos de ejecución chmod +x), veremos que la salida del script es la siguiente:
[raul@localhost /home/raul/]$ ./script_while.sh Este es el mensaje número 1 Este es el mensaje número 2 Este es el mensaje número 3 Este es el mensaje número 4 Este es el mensaje número 5 Este es el mensaje número 6 Este es el mensaje número 7 Este es el mensaje número 8 Este es el mensaje número 9 Este es el mensaje número 10 Este es el mensaje número 11 Este es el mensaje número 12 Este es el mensaje número 13 Este es el mensaje número 14 Este es el mensaje número 15 Bucle finalizado
3.- BUCLES UNTIL
Otro de los bucles es el llamado bucle until y muy similar al bucle while. Lo que hace este bucle es, hasta que no se cumpla una expresión dada, se ejecutarán X líneas de código que queramos. La sintaxis de este bucle es la siguiente:
#!/bin/bash until [ <condición o expresión> ] do <comandos> done
En el siguiente ejemplo, la variable $contador se inicializa con un valor de 1. Hasta que la variable $contador no sea superior a 10, la variable $contador se incrementará en +1 hasta que sea superior a 10. El código es el siguiente:
#!/bin/bash # Bucle básico Until contador=1 until [ $contador -gt 10 ] do echo "El valor de la variable $contador es: " $contador ((contador++)) done echo "Bucle finalizado. Enhorabuena!"
Si guardamos el código en un script llamado script_until.sh y lo ejecutamos (hay que darle permisos de ejecución chmod +x), veremos que la salida del script es la siguiente:
[raul@localhost /home/raul]$ ./script_until.sh El valor de la variable $contador es: 1 El valor de la variable $contador es: 2 El valor de la variable $contador es: 3 El valor de la variable $contador es: 4 El valor de la variable $contador es: 5 El valor de la variable $contador es: 6 El valor de la variable $contador es: 7 El valor de la variable $contador es: 8 El valor de la variable $contador es: 9 El valor de la variable $contador es: 10 Bucle finalizado. Enhorabuena!
4.- BUCLES FOR
El bucle for es algo diferente a los bucles vistos anteriormente. Lo que hace este bucle es, para cada uno de los elementos que le pasemos al bucle, ejecutaremos N acciones. La sintaxis del bucle for es la siguiente:
for variable in <lista> do <comandos> done
En el siguiente ejemplo, vamos a crear una serie de elementos (marchas de coches) que asignaremos a la variable coche y que posteriormente iremos recorriendo uno a uno para mostrar el nombre de cada una de las marcas. Lo que hace el bucle básicamente es, para cada uno de los elementos, hacer N cosas:
#!/bin/bash # Bucle básico For coches='Ford Seat Mercedes Fiat Opel' print "El listado de marcas de coches es:" for coche in $coches do echo $coche done echo "Bucle <for> finalizado!"
Si guardamos el código en un script llamado listado_coches.sh y lo ejecutamos (hay que darle permisos de ejecución chmod +x), veremos que la salida del script es la siguiente:
[raul@localhost /home/raul]$ ./listado_coches.sh El listado de marcas de coches es: Ford Seat Mercedes Fiat Opel Bucle <for> finalizado!
Existe otra forma de poder utilizar el bucle for y es muy similar a la que se usa en otros lenguajes de programacion, como C, Java etc ... La sintáxis de esta otra forma es la siguiente:
for (( EXPRESION1; EXPRESION2; EXPRESION3 )) do comando1 comando2 comando3 done
En el siguiente script mostraremos por pantalla un mensaje desde que la variable $var valga 1 hasta que tome el valor de 5.
#!/bin/bash for (( var=1; var<=5; var++ )) do echo "Te han tocado $var millones de euros!" done
Si guardamos el código en un script llamado bucle_for.sh y lo ejecutamos (hay que darle permisos de ejecución chmod +x), veremos que la salida del script es la siguiente:
[raul@localhost /home/raul]$ ./bucle_for.sh Te han tocado 1 millones de euros! Te han tocado 2 millones de euros! Te han tocado 3 millones de euros! Te han tocado 4 millones de euros! Te han tocado 5 millones de euros!
El bucle for, también puede usarse con rangos de valores. En el siguiente ejemplo, la variable $variable tomará los valores entre 10 y 17 incrementando de 1 en 1:
#!/bin/bash # Bucle básico con rangos for variable in {10..17} do echo $variable done echo "Bucle finalizado!"
Si guardamos el código en un script llamado script_rangos1.sh y lo ejecutamos (hay que darle permisos de ejecución chmod +x), veremos que la salida del script es la siguiente:
También se le puede indicar el step o paso entre cada incremento. En este caso la variable $variable tomará valores entre 10 y 20 incrementando el valor de 2 en 2.
#!/bin/bash # Bucle básico con rangos y pasos for variable in {10..20..2} do echo $variable done echo "Bucle finalizado!"
Si guardamos el código en un script llamado script_rangos2.sh y lo ejecutamos (hay que darle permisos de ejecución chmod +x), veremos que la salida del script es la siguiente:
Aunque no son realmente ningún tipo de bucle, break y continue se suelen utilizar dentro de los bucles vistos anteriormente para obligar al bucle a seguir o salirse de la ejecución. En el siguiente ejemplo, $a toma valores entre 0 y 10, pero si a=5, el bucle finalizará:
#!/bin/bash a=0
while [ $a -lt 10 ] do echo "Valor: $a" ((i++)) if [[ "$a" == '5' ]]; then break fi done
Hola Raúl!. En el punto 4 (BUCLES FOR), como ejemplo pusiste marcas de coches, y todas esas marcas eran de una sola palabra. Si una de las marcas hubiera sido King Long, como cambiaría el código para que King Long sea mostrado/impreso en ese ejemplo?
En el punto 5, dice: $a toma valores entre 0 y 10, pero si a=0, el bucle finalizará: creo que quisiste decir: $a toma valores entre 0 y 10, pero si a=5, el bucle finalizará:
Otra cosilla, hace tiempo estuve tanteando sobre android 7 con Terminal Emulator, y no supe como tratar ficheros cuyo nombres tenían espacios, ej.: Usando for quería renombrar (varios y distintos) +591 76543210.txt a +59176543210.ini osea suprimir los espacios y sustituir la extensión...no pude, como podría conseguir esto? Gracias por adelantado!!
Pues hay muchísimas formas de hacerlo, pero por ejemplo puedes usar 2 líneas para hacerlo. La primera para quitar los espacios de todos los ficheros y luego la segunda cambiarles la extensión:
Si necesitas una Web para tu negocio, atractiva, llamativa y funcional, no lo dudes y contacta conmigo. Me adapto a cualquier requisito para tu negocio.
Comentarios
En el punto 4 (BUCLES FOR), como ejemplo pusiste marcas de coches,
y todas esas marcas eran de una sola palabra.
Si una de las marcas hubiera sido King Long, como cambiaría el código para que King Long sea mostrado/impreso en ese ejemplo?
Pues hay que hacerlo un poco diferente, aqui tienes un ejemplo:
#!/bin/bash
COCHES=(
"Ferrari Rojo"
"Porsche Verde"
"Ford Amarillo"
)
for coche in "${COCHES[@]}"
do
echo "$coche"
done
echo "Bucle finalizado!"
Saludos
$a toma valores entre 0 y 10, pero si a=0, el bucle finalizará:
creo que quisiste decir:
$a toma valores entre 0 y 10, pero si a=5, el bucle finalizará:
Gracias por este post =)
Pues si, estaba mal redactado. Gracias voy a corregirlo ahora mismo.
Saludos
Usando for quería renombrar (varios y distintos) +591 76543210.txt a +59176543210.ini
osea suprimir los espacios y sustituir la extensión...no pude, como podría conseguir esto? Gracias por adelantado!!
Pues hay muchísimas formas de hacerlo, pero por ejemplo puedes usar 2 líneas para hacerlo. La primera para quitar los espacios de todos los ficheros y luego la segunda cambiarles la extensión:
Quitar Espacios:
find . -type f -name "* *.txt" -exec bash -c 'mv "$0" "${0// /}"' {} \;
Cambiar extensión:
find . -type f -name "* *.txt" -exec bash -c 'mv "$0" "${0//.txt/}.ini"' {} \;
Saludos