Estructuras de control en shell scripting
If | Case | For | While | Until
English version: Shell scripting control structures
Los scripts de shell ejecutan los comandos en secuencia de manera similar a otros lenguajes de programación y las estructuras de control pueden cambiar el orden de ejecución de estos comandos.
Condicionales
Las estructuras condicionales son aquellas que permiten ejecutar una acción si se cumple una determinada condición. La estructura de control más común en shell scripting es el comando if
. Este comando permite evaluar una expresión y, si se cumple la condición, ejecutar un bloque de comandos.
if
El siguiente es un ejemplo de if
:
#!/bin/bash
if [ condition ]; then
Do something
elif [ condition 2 ]; then
Do something
else
Do something
fi
Los espacios entre la condición y los corchetes es necesario (en bash).
Una alternativa de construir las condiciones es [[ condition ]].
El fin de la estructura se cierra con la palabra fi (if al revés).
Existen múltiples operadores que se pueden emplear en las condiciones como:
Cadenas:
[ "abc" \= "abc" ] => Si la cadena 1 es exactamente igual a la cadena 2 (verdadero).
[ "abc" != "abc" ] => Si la cadena 1 no es igual a la cadena 2 (falso).
[[ "abcd" \= *bc* ]] => Si la cadena 1 contiene la cadena 2 (verdadero).
[[ "abe" \= "ab**[cd]**" ]] => Si el tercer caracter de la cadena 1 es c o d (falso).
[ -z $var ] => Si la variable está vacía o es null.
[ -n $var ] => Si la longitud de la cadena es distinta de 0.
Números:
[ 5 -eq 5 ] => Si el número 1 es igual al número 2 (verdadero).
[ 5 -ne 5 ] => Si el número 1 no es igual al número 2 (falso).
[ 5 -gt 5 ] => Si el número 1 es mayor al número 2 (falso).
[ 5 -ge 5 ] => Si el número 1 es mayor o igual al número 2 (verdadero).
[ 5 -lt 5 ] => Si el número 1 es menor al número 2 (falso).
[ 5 -le 5 ] => Si el número 1 es menor o igual al número 2 (verdadero).
Archivos:
[ -e file ] => Si el archivo existe.
[ -f file ] => Si es un archivo regular.
[ -d /dir ] => Si el parámetro es un directorio.
[ -s file ] => Si el tamaño del archivo es distinto de 0.
[ -r file ] => Si el archivo tiene permisos de lectura.
[ -w file ] => Si el archivo tiene permisos de escritura.
[ -x file ] => Si el archivo tiene permisos de ejecución.
Lógicos:
[ ! -e file ] => Niega el resultado.
[ condition ] && [ condition ] => Ambas condiciones deben ser verdaderas para que el resultado sea verdadero.
[ condition ] || [ condition ] => Una de las condiciones debe ser verdadera para que el resultado sea verdadero.
case
El siguiente es un ejemplo de case
:
#!/bin/bash
case $choice in
1)
Do something
;;
2)
Do something
;;
*)
Do something
;;
esac
El espacio (o el salto de línea) entre el paréntesis y el comando es necesario.
Cada bloque dentro del case debe cerrarse con ;; .
Se pueden colocar los ;; de cierre al final del último comando, pero como buena práctica se lo cola en una línea nueva para ayudar a la legibilidad.
Bucles
Las estructuras de bucle permiten ejecutar un bloque de comandos repetidas veces hasta que se cumpla una condición. En shell scripting, existen dos tipos de estructuras de bucle: for
y while
.
for
El siguiente es un ejemplo de for
:
#!/bin/bash
for variable in lista; do
Do something
done
- Las palabras do y done indican el inicio y fin del bloque de instrucciones.
Existen múltiples formas de definir la lista de elementos como:
Números:
#!/bin/bash
for number in 1 2 3 4; do
echo $number
done
- También es posible usar {0..4} para representar la lista anterior.
Archivos en un directorio:
#!/bin/bash
for file in *; do
echo $file
done
- El asterisco (*) es un comodín que significa todos los archivos en el directorio actual.
Cadenas de caracteres:
#!/bin/bash
for string in "Hello" "World"; do
echo $string
done
Salida de un comando:
#!/bin/bash
for directory in $(ls); do
echo $directory
done
También es posible escribir el bucle for
de la siguiente manera (de forma similar a otros lenguajes de programación):
#!/bin/bash
for (( number = 0 ; number <= 4; number++ )); do
echo $directory
done
while
El siguiente es un ejemplo de while
:
#!/bin/bash
while [ condition ]; do
Do something
done
Como la condición se evalúa en cada iteración del bucle, si esta nunca se vuelve falsa, será un bucle infinito, para evitar esto es importante asegurarse de que la condición eventualmente se vuelva falsa o utilizar una instrucción break
como se ve a continuación:
#!/bin/bash
counter=1
while true; do
echo $counter
if [ $counter -eq 10 ]
then
break
fi
counter=$((counter + 1))
done
En este ejemplo, el bucle "while" se ejecuta indefinidamente con la condición true
. En cada iteración, se imprime el valor de counter
y luego se incrementa en 1. Si el valor de counter
es igual a 10, se ejecuta la instrucción break
, lo que detiene el bucle.
La instrucción break
es útil en los bucles para detenerlos en un momento específico si se cumple una determinada condición. Esto ayuda a evitar bucles infinitos y a mejorar la eficiencia y el control del código.
until
El siguiente es un ejemplo de until
:
#!/bin/bash
until [ condition ]; do
Do something
done
Pueden presentarse situaciones en las que sea necesario saltar una iteración específica y continuar con la siguiente, esto es posible usando la instrucción continue
como se ve a continuación:
#!/bin/bash
counter=0
until [ $counter -eq 10 ]
do
counter=$((counter + 1))
if [ $((counter % 2)) -eq 0 ]
then
continue
fi
echo $counter
done
En este ejemplo, se define una variable de contador counter
inicializada en 0. El bucle "until" continuará hasta que el valor de counter
sea igual a 10. En cada iteración, se aumenta el valor de counter
en 1. Luego, se evalúa si el resto de la división de counter
entre 2 es igual a 0. Si se cumple esta condición, se ejecuta la instrucción continue
, lo que salta la iteración actual y continúa con la siguiente. Si la condición no se cumple, se imprime el valor de counter
.
Como resultado, este código imprimirá los números impares del 1 al 9.
La instrucción continue
es útil en los bucles para saltar una iteración específica si se cumple una determinada condición, sin tener que salir del bucle completamente. Esto ayuda a mejorar la eficiencia y el control del código, y es una buena práctica de codificación para escribir código legible y mantenible.
Si te resultó útil, dale me gusta/comparte a este artículo para que llegue a otros y si eres nuevo en el blog, ¡te agradecería que me sigas! Trato de escribir artículos para mantener un registro de todo lo que he aprendido o que personalmente quiero leer y me encanta saber cómo lo hice u obtener ideas de los lectores.
¡Hasta la próxima!