
Anteriormente vimos los operadores, que junto con las estructuras de control en Bash permiten modificar el funcionamiento de la aplicación basándse en condiciones y ciclos. Estas estructuras son fundamentales para tomar gestionar el comportamiento de los programas.
Las estructuras de control en Bash más utilizadas son:
if
else
elif
for
while
break
continue
exit
Contenido
Control de flujo en Bash
Seguramente ya estamos familiarizados con la sentencia if-elseif-else
. Esta nos sirve para controlar las decisiones del código según vayan cambiando los valores de nuestras variables en un punto determinado del código. Así podemos ejecutar las instrucciones que nuestro programa requiera.
if-elif
La condición if
se utiliza para ejecutar comandos basados en condiciones dadas por los valores de nuestra variables. Pero también podemos hacer la combinación con elif
, que básicamente es como se llama aquí a else-if
y que nos permite evaluar una condición adicional a la primera.
La sintaxis básica es:
1 2 3 4 5 | if [ condicion_1 ]; then ... elif [ condicion_2 ]; then ... fi |
En un ejemplo:
1 2 3 4 5 6 7 8 9 | #!/bin/bash edad=18 if [ $edad -lt 18 ]; then echo "Eres menor de edad." elif [ $edad -gt 18 ]; then echo "Tienes más de 18 años." fi |
Con esta condición estamos preguntando si la edad
es menor que (less than) 18
y si esto es correcto nos mostrará el mensaje “Eres menor de edad.”, de lo contrario evaluará la siguiente condición que valida si la edad
es mayor que (greater than) 18
entonces escribirá el mensaje “Tienes más de 18 años.”. Si ninguna condición se cumple (cuando la edad sea exactamente igual 18
) no imprimirá ningún mensaje en la pantalla.
if-elif-else
Aunque podemos resolver el problema usando otro tipo de comparación, como por ejemplo, usando el mayor o igual que (greater than or equal, -ge
), puede ser que querramos saber si el usuario tiene exactamente 18 años. Para ello usamos la variante de if-elif-else
. En donde el else
se convierte en nuestro comodín cuando todo lo demás falla.
La sintaxis básica es:
1 2 3 4 5 6 7 8 9 | if [ condicion_1 ]; then ... elif [ condicion_2 ]; then ... elif [ condicion_3 ]; then ... else ... fi |
Veamos el ejemplo:
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash edad=18 if [ $edad -lt 18 ]; then echo "Eres menor de edad." elif [ $edad - eq 18 ]; then echo "Tienes 18 años." else echo "Eres mayor de edad." fi |
Aquí tenemos las tres opciones posibles: que sea menor, que sea igual o que sea mayor.
Ciclos en Bash
Un ciclo (también se llama bucle) es una estructura que permite repetir un bloque de código varias veces hasta que se cumpla una condición específica o hasta que explícitamente le digamos que debe salir. Los ciclos son útiles para automatizar tareas repetitivas, como recorrer los elementos de una array. Veremos los dos comunes: for
y while
.
for
El ciclo for
se utiliza para ejecutar un bloque de código un número determinado de veces, o para iterar sobre una lista de elementos de la que ya sabemos su longitud (también sin conocerla, pero es el escenario común).
Su sintaxis es:
1 2 3 | for variable in lista; do # Código a ejecutar en cada iteración done |
Ejemplo:
1 2 3 4 5 | #!/bin/bash for numero in 1 2 3 4 50; do echo "Número: $numero" done |
Con esto nos imprimirá 5 líneas con el valor de cada elemento.
También puedes utilizar un rango de números con el operador {}
:
1 2 3 4 5 | #!/bin/bash for numero in {1..5}; do echo "Número: $numero" done |
Recorrer un array en Bash con for
Uno de los usos más comunes de for
que veremos es recorrer un array. Para hacerlo hay varias formas. El primero nos arroja el index de cada elemento mediante la instrucción especial ${!langs[@]}
:
1 2 3 4 5 6 7 | #!/bin/bash langs=( "go" "c#" "java" "bash" ) for index in "${!langs[@]}" ; do echo "Index: $index" done |
Lo anterior nos regresaría la posición, no el valor.
Ahora la expresión ${langs[@]}
nos regresa el valor en la posición que en la que estamos iterando.
1 2 3 4 5 6 7 | #!/bin/bash langs=( "go" "c#" "java" "bash" ) for lang in "${langs[@]}" ; do echo "Lenguaje: $lang" done |
Ahora, para utilizar tanto el index como el valor, lo hacemos así:
1 2 3 4 5 | #!/bin/bash for index in "${!langs[@]}" ; do echo "Index $index => ${langs[$index]}" done |
Aquí recorremos el array tomando los indexes y luego directamente leemos el array enviándole la posición en la que for
esté.
while
El ciclo while
ejecuta un bloque de código mientras una condición sea verdadera. Este es un buena estructura para recorrer algo cuando no conocemos su longitud.
Sintaxis:
1 2 3 | while [ condición ]; do ... done |
Ejemplo:
1 2 3 4 5 6 7 8 | #!/bin/bash contador=1 while [ $contador - le 5 ]; do echo "Contador: $contador" ((contador++)) done |
Otras instrucciones de control
break
El comando break
se usa para salir de un ciclo antes de que se complete, por lo general se define mediante una condición que se evalua, ya sea por la variable de control general o alguna otra.
Ejemplo con break
:
1 2 3 4 5 6 7 8 | #!/bin/bash for numero in {1..10}; do if [ $numero - eq 5 ]; then break fi echo "Número: $numero" done |
En este caso, el ciclo for
se interrumpe cuando numero
es igual a 5.
continue
El comando continue
permite saltarse un paso en la ejecución de la instrucción dentro del ciclo y volver a ejecutar el ciclo. Esto puede ser en cualquier lugar dentro del ciclo.
Ejemplo con continue
:
1 2 3 4 5 6 7 8 | #!/bin/bash for numero in {1..5}; do if [ $numero - eq 3 ]; then continue fi echo "Número: $numero" done |
Aquí, cuando numero
es 3
(-eq
, equals), la instrucción continue
hace que se salte esa iteración, por lo que no se imprime la línea “Número: 3” pero sí las demás.
exit
El comando exit
finaliza el script inmediatamente y te permite devolver un código de salida opcional.
Ejemplo con exit
:
1 2 3 4 5 6 7 8 9 | #!/bin/bash echo "Comenzando el script..." # Finalizar el script exit 0 # Este código nunca se ejecutará echo "Esto no se mostrará." |
En este ejemplo, el script finaliza con el código de salida 0
, que significa “ejecución exitosa”. Las líneas después de exit
no se ejecutan.
Esto ha sido el post sobre las estructuras de control de Bash. Después veremos otros ejemplos donde iremos juntando todo el conocimiento hasta ahora.
¡Gracias por leer!