Saltar al contenido principal

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

  1. Creá un script que reciba un número y diga si es par o impar
  2. Creá un script que verifique si un comando existe en el sistema (ej: docker, git)
  3. Creá un menú con case que ofrezca 5 operaciones del sistema diferentes