Clase 03 — Condicionales (if, case)
Estructura básica del if
#!/bin/bash
edad=18
if [[ $edad -ge 18 ]]; then
echo "Sos mayor de edad"
fi
if / else
#!/bin/bash
edad=15
if [[ $edad -ge 18 ]]; then
echo "Sos mayor de edad"
else
echo "Sos menor de edad"
fi
if / elif / else
#!/bin/bash
read -p "Ingresá tu nota (0-100): " nota
if [[ $nota -ge 90 ]]; then
echo "Calificación: A (Excelente)"
elif [[ $nota -ge 80 ]]; then
echo "Calificación: B (Muy bien)"
elif [[ $nota -ge 70 ]]; then
echo "Calificación: C (Bien)"
elif [[ $nota -ge 60 ]]; then
echo "Calificación: D (Regular)"
else
echo "Calificación: F (Reprobado)"
fi
Operadores de comparación numérica
#!/bin/bash
a=10
b=20
# Dentro de [[ ]]
[[ $a -eq $b ]] && echo "Iguales" # equal
[[ $a -ne $b ]] && echo "Diferentes" # not equal
[[ $a -gt $b ]] && echo "a > b" # greater than
[[ $a -lt $b ]] && echo "a < b" # less than
[[ $a -ge $b ]] && echo "a >= b" # greater or equal
[[ $a -le $b ]] && echo "a <= b" # less or equal
# También se pueden usar operadores dentro de (( ))
if (( a < b )); then
echo "$a es menor que $b"
fi
Operadores de comparación de strings
#!/bin/bash
str1="hola"
str2="mundo"
vacia=""
# Igualdad
if [[ "$str1" == "hola" ]]; then
echo "str1 es 'hola'"
fi
# Desigualdad
if [[ "$str1" != "$str2" ]]; then
echo "str1 y str2 son diferentes"
fi
# String vacío
if [[ -z "$vacia" ]]; then
echo "La variable está vacía"
fi
# String no vacío
if [[ -n "$str1" ]]; then
echo "str1 no está vacía"
fi
# Comparar con patrón (glob)
nombre="DevOps_Engineer"
if [[ "$nombre" == Dev* ]]; then
echo "Empieza con 'Dev'"
fi
# Comparar con regex
email="user@email.com"
if [[ "$email" =~ ^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$ ]]; then
echo "Email válido"
fi
Operadores lógicos
#!/bin/bash
edad=25
tiene_licencia=true
# AND (&&)
if [[ $edad -ge 18 ]] && [[ "$tiene_licencia" == true ]]; then
echo "Puede conducir"
fi
# OR (||)
dia="sábado"
if [[ "$dia" == "sábado" ]] || [[ "$dia" == "domingo" ]]; then
echo "Es fin de semana"
fi
# NOT (!)
archivo="test.txt"
if [[ ! -f "$archivo" ]]; then
echo "El archivo NO existe"
fi
Operadores de archivos
#!/bin/bash
archivo="test.txt"
directorio="/tmp"
enlace="/usr/bin/python"
# Existe?
[[ -e "$archivo" ]] && echo "Existe"
# Es archivo regular?
[[ -f "$archivo" ]] && echo "Es un archivo"
# Es directorio?
[[ -d "$directorio" ]] && echo "Es un directorio"
# Es enlace simbólico?
[[ -L "$enlace" ]] && echo "Es un enlace simbólico"
# Tiene contenido? (tamaño > 0)
[[ -s "$archivo" ]] && echo "No está vacío"
# Permisos
[[ -r "$archivo" ]] && echo "Tiene permiso de lectura"
[[ -w "$archivo" ]] && echo "Tiene permiso de escritura"
[[ -x "$archivo" ]] && echo "Tiene permiso de ejecución"
Ejemplo: Verificador de archivos
#!/bin/bash
# verificador.sh - Verifica propiedades de un archivo
read -p "Ingresá la ruta de un archivo: " ruta
if [[ ! -e "$ruta" ]]; then
echo "ERROR: '$ruta' no existe"
exit 1
fi
echo ""
echo "=== Información de: $ruta ==="
echo ""
if [[ -f "$ruta" ]]; then
echo "Tipo: Archivo regular"
elif [[ -d "$ruta" ]]; then
echo "Tipo: Directorio"
elif [[ -L "$ruta" ]]; then
echo "Tipo: Enlace simbólico"
fi
echo -n "Lectura: " && [[ -r "$ruta" ]] && echo "Sí" || echo "No"
echo -n "Escritura: " && [[ -w "$ruta" ]] && echo "Sí" || echo "No"
echo -n "Ejecución: " && [[ -x "$ruta" ]] && echo "Sí" || echo "No"
echo -n "Vacío: " && [[ -s "$ruta" ]] && echo "No" || echo "Sí"
if [[ -f "$ruta" ]]; then
echo "Tamaño: $(wc -c < "$ruta") bytes"
echo "Líneas: $(wc -l < "$ruta")"
fi
case — Selección múltiple
#!/bin/bash
# menu.sh - Menú con case
echo "========================"
echo " MENÚ PRINCIPAL"
echo "========================"
echo "1) Ver fecha"
echo "2) Ver usuario"
echo "3) Ver directorio"
echo "4) Ver espacio en disco"
echo "5) Salir"
echo "========================"
read -p "Seleccioná una opción: " opcion
case $opcion in
1)
echo "Fecha: $(date)"
;;
2)
echo "Usuario: $(whoami)"
;;
3)
echo "Directorio: $(pwd)"
;;
4)
df -h /
;;
5)
echo "¡Hasta luego!"
exit 0
;;
*)
echo "Opción no válida"
exit 1
;;
esac
Ejemplo: Gestor de servicios simple
#!/bin/bash
# servicio.sh - Simulador de gestión de servicios
servicio="$1"
accion="$2"
if [[ -z "$servicio" ]] || [[ -z "$accion" ]]; then
echo "Uso: $0 <servicio> <start|stop|restart|status>"
exit 1
fi
case "$accion" in
start)
echo "Iniciando $servicio..."
echo "$servicio está corriendo (PID: $$)"
;;
stop)
echo "Deteniendo $servicio..."
echo "$servicio detenido correctamente"
;;
restart)
echo "Reiniciando $servicio..."
echo "$servicio reiniciado (PID: $$)"
;;
status)
echo "$servicio: activo (simulado)"
;;
*)
echo "Acción '$accion' no reconocida"
echo "Acciones válidas: start, stop, restart, status"
exit 1
;;
esac
Operador ternario (shorthand)
#!/bin/bash
edad=20
# Ternario con && y ||
[[ $edad -ge 18 ]] && echo "Mayor" || echo "Menor"
# Asignar valor condicional
estado=$( [[ $edad -ge 18 ]] && echo "adulto" || echo "menor" )
echo "Estado: $estado"
# Valor por defecto si variable está vacía
nombre=""
echo "Hola, ${nombre:-Invitado}" # Usa "Invitado" si nombre está vacío
Ejercicios
- Creá un script que reciba un número y diga si es par o impar
- Creá un script que verifique si un comando existe en el sistema (ej:
docker,git) - Creá un menú con
caseque ofrezca 5 operaciones del sistema diferentes