¿QUÉ ES UN BUCLE EN PROGRAMACIÓN?
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
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:
[raul@localhost /home/raul]$ ./script_rangos1.sh
10
11
12
13
14
15
16
17
Bucle finalizado!
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:
[raul@localhost /home/raul]$ ./script_rangos2.sh
10
12
14
16
18
20
Bucle finalizado!
5.- BREAK Y CONTINUE EN BUCLES
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
[raul@localhost /home/raul]$ ./script_break.sh
Valor: 0
Valor: 1
Valor: 2
Valor: 3
Valor: 4
En el siguiente ejemplo, $a toma valores entre 0 y 10, y se mostrará un mensaje solo cuando a sea diferente de 7:
#!/bin/bash
a=0
while [ $a -lt 10 ]
do
((a++))
if [[ "$a" == '7' ]]; then
continue
fi
echo "Valor: $a"
done
echo 'Finalizado!'
Si ejecutamos el código anterior, la salida que veremos es la siguiente:
[raul@localhost /home/raul]$ ./script_continue.sh
Valor: 1
Valor: 2
Valor: 3
Valor: 4
Valor: 5
Valor: 6
Valor: 8
Valor: 9
Valor: 10
Finalizado!
ENJOY!
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