Apuntes bash

No es un bug, es una característica del shell.

Estructuras de Control de Flujo en Bash

Condicionales: if, then, elif, else, fi

Las estructuras condicionales if permiten ejecutar comandos solo si se cumple una condición. La sintaxis básica es if, seguida de then, y se cierra con fi. Puedes usar elif para condiciones adicionales y else para un caso por defecto.

Ejemplo:

#!/bin/bash
read -p "Ingresa un número: " NUM
if [ $NUM -gt 10 ]; then
    echo "El número es mayor que 10"
elif [ $NUM -eq 10 ]; then
    echo "El número es igual a 10"
else
    echo "El número es menor que 10"
fi

Nota: Los corchetes [ ] son un comando de prueba (test). Usa operadores como -gt (mayor que), -eq (igual), -lt (menor que), y deja espacios dentro de los corchetes. Encierra las variables entre comillas dobles (por ejemplo, "$NUM") para evitar problemas si la variable está vacía o contiene espacios.

Bucles: for, while, until, select

Los bucles permiten repetir comandos múltiples veces. Bash ofrece cuatro tipos principales:

  • for: Itera sobre una lista de elementos.
  • while: Repite mientras una condición sea verdadera.
  • until: Repite hasta que una condición sea verdadera.
  • select: Crea un menú interactivo para seleccionar opciones.

Ejemplo de for:

#!/bin/bash
for i in 1 2 3 4 5
do
    echo "Iteración $i"
done

Puedes iterar sobre cualquier cosa, no solo números:

#!/bin/bash
for fruta in manzana pera uva
do
    echo "Me gusta la $fruta"
done

o sobre salida de comandos:

#!/bin/bash
        # Itera sobre cada archivo en el directorio actual
        for archivo in $(ls)
        do
        echo "Procesando $archivo"
        done
        

Ejemplo de while:

si vienes de otros lenguajes de programación, bash también admite una iteración mas clásica:

#!/bin/bash
# Sintaxis C-style for loop
for (( i=1; i<=5; i++ ))
do
    echo "Contador C-style: $i"
done

Ejemplo de while:

#!/bin/bash
CONTADOR=1
while [ $CONTADOR -le 5 ]
do
    echo "Contador: $CONTADOR"
    ((CONTADOR++))
done

Ejemplo de until:

#!/bin/bash
CONTADOR=1
until [ "$CONTADOR" -gt 5 ]
do
    echo "Contador: $CONTADOR"
    ((CONTADOR++))
done

Ejemplo de select:

#!/bin/bash
echo "Elige una opción:"
select OPCION in "Opción 1" "Opción 2" "Salir"
do
    case $OPCION in
        "Opción 1")
            echo "Seleccionaste: Opción 1"
            ;;
        "Opción 2")
            echo "Seleccionaste: Opción 2"
            ;;
        "Salir")
            echo "Saliendo..."
            break # Sale del bucle select
            ;;
        *) # Caso por defecto para entradas inválidas
            echo "Opción inválida. Intenta de nuevo."
            ;;
    esac
done

Nota: Usa break para salir de un bucle y continue para saltar a la siguiente iteración.

La instrucción case

La instrucción case evalúa una variable y ejecuta comandos según su valor, siendo una alternativa más clara a múltiples if. Se cierra con esac.

Ejemplo:

#!/bin/bash
read -p "Ingresa un día de la semana: " DIA
case $DIA in
    "lunes"|"Lunes")
        echo "¡Es el inicio de la semana!"
        ;;
    "viernes"|"Viernes")
        echo "¡Casi fin de semana!"
        ;;
    *)
        echo "Otro día de la semana"
        ;;
esac

Nota: Usa ) para cerrar cada caso, ;; para separar casos, y *) para el caso por defecto. Puedes usar patrones (como lunes|Lunes) para mayor flexibilidad.

Insistir, no ya en bash, sino en cualquier lenguaje de programación, que es esencial que cualquier bucle que escribas tenga una condición de salida bien definida. Si un bucle nunca alcanza una condición que lo termine, se convertirá en un bucle infinito. Esto hará que tu script se quede "colgado" o consuma recursos de forma indefinida. Específicamente, asegúrate de que la condición que controla el bucle eventualmente se vuelva falsa (en el caso de while) o verdadera (en el caso de until). Esto implica que alguna variable o estado dentro del bucle debe cambiar con cada iteración.

TOP