4. Operadores, Condicionales y Comparaciones

Hasta ahora tus scripts ejecutaban instrucciones una detrás de otra. Eso está bien, pero es limitado. Para tomar decisiones en un script necesitas condiciones: comprobar valores, comparar texto o números, verificar si existen archivos, etc.

Este módulo introduce las herramientas para que un script pueda responder dinámicamente a distintas situaciones.


1. El bloque if en Bash

La estructura básica es:





if [ condición ]; then
    comandos
fi

Ejemplo:





numero=10

if [ $numero -gt 5 ]; then
    echo "El número es mayor que 5"
fi

El then va en la misma línea que if, o en la siguiente separado por ;.


2. if / elif / else

Para varias condiciones se usa elif (“else if”):





if [ condición1 ]; then
    comandos
elif [ condición2 ]; then
    comandos
else
    comandos por defecto
fi

Ejemplo:





edad=15

if [ $edad -ge 18 ]; then
    echo "Mayor de edad"
else
    echo "Menor de edad"
fi

3. Tipos de comparaciones

Hay dos grandes tipos: numéricas y de cadenas.

3.1 Comparaciones numéricas

Se usan operadores de una sola palabra:

  • -eq → igual
  • -ne → distinto
  • -gt → mayor que (“greater than”)
  • -ge → mayor o igual
  • -lt → menor que
  • -le → menor o igual

Ejemplo:





if [ $x -lt 100 ]; then
    echo "x es menor que 100"
fi

3.2 Comparaciones de cadenas

Se usan:

  • = → igual
  • != → distinto
  • -z → cadena vacía
  • -n → cadena NO vacía

Ejemplos:





if [ "$nombre" = "Ana" ]; then
    echo "Hola Ana"
fi




if [ -z "$variable" ]; then
    echo "La variable está vacía"
fi

Importante entrecomillar variables para evitar errores cuando están vacías.


4. Comparación avanzada con [[ ]]

Bash también admite [[ ]], que permite hacer comparaciones más modernas y usar patrones (==, !=, comodines).

Ejemplo:





if [[ $animal == "gato" ]]; then
    echo "Es un gato"
fi

Permite patrones:





if [[ $nombre == A* ]]; then
    echo "El nombre empieza por A"
fi

5. Operadores lógicos (&&, ||)

Se pueden combinar condiciones:

  • && → Y lógico
  • || → O lógico

Ejemplo:





if [ $edad -ge 18 ] && [ $edad -lt 65 ]; then
    echo "Adulto en edad laboral"
fi

Otro ejemplo con ||:





if [ "$respuesta" = "S" ] || [ "$respuesta" = "s" ]; then
    echo "Respuesta afirmativa"
fi

6. Condiciones sobre archivos

En administración de sistemas esto se usa TODO el tiempo.

Operadores útiles:

  • -f archivo → existe y es archivo regular
  • -d ruta → existe y es directorio
  • -r archivo → se puede leer
  • -w archivo → se puede escribir
  • -x archivo → se puede ejecutar

Ejemplos:





if [ -d /etc ]; then
    echo "/etc existe"
fi




if [ -f datos.txt ]; then
    echo "El archivo datos.txt existe"
fi

7. El comando test

[ ] es un alias de test.

Las siguientes líneas son equivalentes:





if [ $x -gt 10 ]

y





if test $x -gt 10

No cambia nada en lógica, pero conviene conocerlo porque se ve mucho en scripts antiguos.


8. El case: otra forma de decidir

Cuando hay muchas opciones, case evita varios elif seguidos.

Sintaxis:





case $variable in
    opción1)
        comandos ;;
    opción2)
        comandos ;;
    *)
        comandos por defecto ;;
esac

Ejemplo:





read -p "Introduce una letra: " letra

case $letra in
    a|A) echo "Has pulsado A" ;;
    b|B) echo "Has pulsado B" ;;
    *) echo "Opción no reconocida" ;;
esac

Muy útil para menús interactivos.


9. Ejemplos

Ejemplo 1: Verificar si un archivo existe





#!/bin/bash

if [ -f "$1" ]; then
    echo "El archivo $1 existe."
else
    echo "El archivo $1 no existe."
fi

Ejemplo 2: Verificar si un usuario es mayor de edad





#!/bin/bash

read -p "Introduce tu edad: " edad

if [ $edad -ge 18 ]; then
    echo "Eres mayor de edad."
else
    echo "Eres menor de edad."
fi

Ejemplo 3: Menú con case





#!/bin/bash

echo "1) Mostrar fecha"
echo "2) Mostrar usuario"
echo "3) Salir"

read -p "Elige una opción: " opcion

case $opcion in
    1) date ;;
    2) echo "Usuario: $USER" ;;
    3) echo "Adiós" ;;
    *) echo "Opción no válida" ;;
esac

Ejercicios propuestos

Ejercicio 1:
Crear un script mayor.sh que pida un número y diga si es mayor, menor o igual que 100.

Ejercicio 2:
Crear un script existe.sh que reciba un nombre de archivo como parámetro y diga si existe y si es archivo o directorio.

Ejercicio 3:
Crear un script menu.sh que muestre tres opciones con case:

  • Mostrar nombre de usuario
  • Mostrar fecha
  • Salir

Ejercicio 4:
Crear un script login.sh que pida usuario y contraseña y verifique:

  • Si el usuario es «admin»
  • Si la contraseña es «secreto»

Mostrará “Acceso permitido” o “Acceso denegado”.

Soluciones

Ejercicio 1 — mayor.sh

Enunciado:
Pedir un número y decir si es mayor, menor o igual que 100.

Solución:





#!/bin/bash
# Script: mayor.sh
# Compara un número con 100

read -p "Introduce un número: " num

if [ "$num" -gt 100 ]; then
    echo "$num es mayor que 100"
elif [ "$num" -lt 100 ]; then
    echo "$num es menor que 100"
else
    echo "$num es igual a 100"
fi

Ejemplo de uso:

Entrada: 120
Salida: 120 es mayor que 100


Ejercicio 2 — existe.sh

Enunciado:
Recibir un nombre de archivo/directorio como parámetro y comprobar:

  • Si existe
  • Si es archivo o directorio

Solución con validación básica:





#!/bin/bash
# Script: existe.sh
# Comprueba si un archivo/directorio existe

if [ $# -ne 1 ]; then
    echo "Uso: $0 nombre_archivo"
    exit 1
fi

ruta="$1"

if [ -e "$ruta" ]; then
    if [ -f "$ruta" ]; then
        echo "$ruta existe y es un archivo"
    elif [ -d "$ruta" ]; then
        echo "$ruta existe y es un directorio"
    else
        echo "$ruta existe, pero no es archivo ni directorio común"
    fi
else
    echo "$ruta no existe"
fi

Ejemplo de uso:





./existe.sh /etc

Salida:





/etc existe y es un directorio

Ejercicio 3 — menu.sh

Enunciado:
Crear un menú con case que muestre tres opciones:

  1. Mostrar nombre de usuario
  2. Mostrar fecha
  3. Salir

Solución:





#!/bin/bash
# Script: menu.sh
# Menú básico con case

echo "Menú:"
echo "1) Mostrar nombre de usuario"
echo "2) Mostrar fecha"
echo "3) Salir"

read -p "Elige una opción: " opcion

case "$opcion" in
    1)
        echo "Usuario: $USER"
        ;;
    2)
        echo "Fecha actual: $(date +"%Y-%m-%d %H:%M:%S")"
        ;;
    3)
        echo "Saliendo..."
        ;;
    *)
        echo "Opción no válida"
        ;;
esac

Ejemplo:

Entrada: 2
Salida (aprox):





Fecha actual: 2026-01-11 18:42:00

Ejercicio 4 — login.sh

Enunciado:
Pedir usuario y contraseña y verificar:

  • usuario == admin
  • contraseña == secreto

Si coincide: Acceso permitido
Si no: Acceso denegado

Solución:





#!/bin/bash
# Script: login.sh
# Verificación simple de usuario/contraseña

read -p "Usuario: " usuario
read -s -p "Contraseña: " password
echo

if [ "$usuario" = "admin" ] && [ "$password" = "secreto" ]; then
    echo "Acceso permitido"
else
    echo "Acceso denegado"
fi

Ejemplo:

Entrada:





Usuario: admin
Contraseña: secreto

Salida:





Acceso permitido