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 listadosPAT1|PAT2→ OR de patrones (coincide con cualquiera);;→ termina el bloque (equivale abreak);&→ 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"