Condicionales: if, elif, else, case

Introducción

Las estructuras condicionales permiten ejecutar diferentes bloques de código según se cumplan o no ciertas condiciones. Bash ofrece if/elif/else para condiciones generales y case para comparar un valor contra múltiples patrones.

if / elif / else

Sintaxis básica:


if CONDICIÓN; then
    # bloque si se cumple la condición
elif OTRA_CONDICIÓN; then
    # bloque si se cumple la segunda condición
else
    # bloque si no se cumple ninguna condición
fi
          

Ejemplos:


#!/usr/bin/env bash

# Comprobar si un fichero existe
if [ -f "/etc/passwd" ]; then
    echo "El fichero existe"
fi

# Con else
EDAD=20
if [ $EDAD -ge 18 ]; then
    echo "Mayor de edad"
else
    echo "Menor de edad"
fi

# Con elif
NOTA=7
if [ $NOTA -ge 9 ]; then
    echo "Sobresaliente"
elif [ $NOTA -ge 7 ]; then
    echo "Notable"
elif [ $NOTA -ge 5 ]; then
    echo "Aprobado"
else
    echo "Suspenso"
fi
          

Condición directa con comandos:

if evalúa el código de salida de cualquier comando, no solo comparaciones con [ ]:


# Si grep encuentra el patrón (exit 0), entra en el if
if grep -q "root" /etc/passwd; then
    echo "El usuario root existe"
fi

# Si ping tiene éxito (exit 0)
if ping -c1 -W2 8.8.8.8 >/dev/null 2>&1; then
    echo "Hay conexión a internet"
else
    echo "Sin conexión"
fi

# Negación con !
if ! id "usuario_inexistente" >/dev/null 2>&1; then
    echo "El usuario no existe, lo voy a crear"
fi
          

case — Múltiples patrones

case compara una variable contra varios patrones (usando globbing, no regex). Es más legible que una cadena de elif cuando se compara un valor contra muchas opciones.

Sintaxis:


case VARIABLE in
    PATRÓN1)
        # comandos
        ;;
    PATRÓN2)
        # comandos
        ;;
    *)
        # caso por defecto (equivale a else)
        ;;
esac
          

Ejemplo con opciones de menú:


#!/usr/bin/env bash
echo "¿Qué quieres hacer?"
echo "1) Listar ficheros"
echo "2) Ver espacio en disco"
echo "3) Ver procesos"
read -p "Opción: " OPCION

case $OPCION in
    1)
        ls -lh
        ;;
    2)
        df -h
        ;;
    3)
        ps aux
        ;;
    q|Q|salir)
        echo "Saliendo"
        exit 0
        ;;
    *)
        echo "Opción no válida" >&2
        exit 1
        ;;
esac
          

Patrones en case:


case "$EXTENSION" in
    *.tar.gz|*.tgz)  echo "Archivo tar+gzip" ;;
    *.zip)           echo "Archivo zip" ;;
    *.txt|*.md)      echo "Documento de texto" ;;
    [0-9]*)          echo "Empieza por número" ;;
    *)               echo "Tipo desconocido" ;;
esac
          
  • * → cualquier cadena (comodín)
  • ? → cualquier carácter único
  • [abc] → uno de los caracteres listados
  • PAT1|PAT2 → OR de patrones (coincide con cualquiera)
  • ;; → termina el bloque (equivale a break)
  • ;& → continúa ejecutando el siguiente bloque sin comprobar el patrón (fall-through)

Expresión condicional compacta

Para asignaciones simples basadas en una condición, hay formas más concisas que un if:


# Asignar valor por defecto si la variable está vacía
NOMBRE="{$1:-Desconocido}"

# Ejecutar comando según condición (una línea)
[ -d /backup ] || mkdir -p /backup

# Asignar resultado de condición
[[ $EDAD -ge 18 ]] && ESTADO="mayor" || ESTADO="menor"
          

Usar case cuando haya más de 3 valores posibles para una misma variable — es más legible que una cadena de elif. Recordar el ;; al final de cada bloque.

Bucles: for, while, until, break, continue

Índice de la sección

Índice del curso