Skip to content

Ejercicios de Shell Scripting para ASIR

Nivel Básico

Ejercicio 1: Hola Mundo

Crea un script que muestre "Hola, [nombre]" donde el nombre se pase como argumento.

bash
#!/bin/bash
echo "Hola, $1"

Uso: ./hola.sh Juan


Ejercicio 2: Calculadora Básica

Script que reciba dos números y una operación (+, -, *, /) y muestre el resultado.

bash
#!/bin/bash

if [ $# -ne 3 ]; then
    echo "Uso: $0 <num1> <operador> <num2>"
    exit 1
fi

case $2 in
    +) resultado=$(($1 + $3)) ;;
    -) resultado=$(($1 - $3)) ;;
    *) resultado=$(($1 * $3)) ;;
    /) resultado=$(echo "scale=2; $1 / $3" | bc) ;;
    *) echo "Operador no válido"; exit 1 ;;
esac

echo "Resultado: $resultado"

Ejercicio 3: Información del Sistema

Muestra información básica del sistema (hostname, usuario, fecha, uptime).

bash
#!/bin/bash

echo "=== Información del Sistema ==="
echo "Hostname: $(hostname)"
echo "Usuario: $(whoami)"
echo "Fecha: $(date)"
echo "Uptime: $(uptime)"

Nivel Intermedio

Ejercicio 4: Backup de Directorio

Crea un script que haga backup de un directorio comprimiendo con tar.

bash
#!/bin/bash

DIRECTORIO=$1. # El argumento 1 se asocia a la variable Directorio
FECHA=$(date +%Y%m%d_%H%M%S)

if [ -z "$DIRECTORIO" ]; then.  # -z comprueba que la cadena $directorio no está vacía, es decir, se usó un argumento con el script
    echo "Uso: $0 <directorio>"
    exit 1
fi

if [ ! -d "$DIRECTORIO" ]; then. # -d comprueba que existe el directorio, la ! 
    echo "Error: El directorio no existe"
    exit 1
fi

NOMBRE_BACKUP="backup_$(basename $DIRECTORIO)_$FECHA.tar.gz"

tar -czf "$NOMBRE_BACKUP" "$DIRECTORIO"

if [ $? -eq 0 ]; then # $? es el código de error del comando, si devuelve 0 es que no hay error
    echo "Backup creado: $NOMBRE_BACKUP"
else
    echo "Error al crear el backup"
    exit 1
fi

Ejercicio 5: Monitor de Espacio en Disco

Script que alerte si el uso del disco supera un umbral (ej: 80%).

bash
#!/bin/bash

UMBRAL=80

echo "=== Uso de Disco ==="

df -h | grep '^/dev' | while read linea; do
    uso=$(echo "$linea" | awk '{print $5}' | tr -d '%')
    particion=$(echo "$linea" | awk '{print $1}')
    
    if [ $uso -ge $UMBRAL ]; then
        echo "ALERTA: $particion al ${uso}%"
    else
        echo "OK: $particion al ${uso}%"
    fi
done

Ejercicio 6: Gestor de Usuarios

Script para crear usuarios en lote desde un archivo de texto.

bash
#!/bin/bash

ARCHIVO=$1

if [ -z "$ARCHIVO" ]; then
    echo "Uso: $0 <archivo_usuarios.txt>"
    exit 1
fi

if [ ! -f "$ARCHIVO" ]; then
    echo "Error: El archivo no existe"
    exit 1
fi

while read usuario; do
    if ! id "$usuario" &>/dev/null; then
        sudo useradd -m "$usuario"
        echo "Usuario $usuario creado"
    else
        echo "Usuario $usuario ya existe"
    fi
done < "$ARCHIVO"

archivo_usuarios.txt:

alumno1
alumno2
alumno3

Ejercicio 7: Log Rotator

Script que rote logs cuando superen un tamaño máximo.

bash
#!/bin/bash

LOG_FILE=$1
MAX_SIZE=10485760  # 10MB en bytes

if [ -z "$LOG_FILE" ]; then
    echo "Uso: $0 <archivo_log>"
    exit 1
fi

if [ -f "$LOG_FILE" ]; then
    SIZE=$(stat -f%z "$LOG_FILE" 2>/dev/null || stat -c%s "$LOG_FILE" 2>/dev/null)
    
    if [ $SIZE -ge $MAX_SIZE ]; then
        FECHA=$(date +%Y%m%d_%H%M%S)
        mv "$LOG_FILE" "${LOG_FILE}.${FECHA}"
        touch "$LOG_FILE"
        echo "Log rotado: ${LOG_FILE}.${FECHA}"
    fi
fi

Nivel Avanzado

Ejercicio 8: Monitor de Procesos

Script que monitorice procesos y envíe alerta si consumen mucha CPU.

bash
#!/bin/bash

UMBRAL_CPU=50
EMAIL="admin@example.com"

ps aux --sort=-%cpu | head -11 | tail -10 | while read linea; do
    cpu=$(echo "$linea" | awk '{print $3}' | cut -d. -f1)
    proceso=$(echo "$linea" | awk '{print $11}')
    pid=$(echo "$linea" | awk '{print $2}')
    
    if [ $cpu -ge $UMBRAL_CPU ]; then
        echo "ALERTA: Proceso $proceso (PID: $pid) al ${cpu}% CPU"
        # mail -s "Alerta CPU" $EMAIL <<< "Proceso: $proceso, PID: $pid, CPU: ${cpu}%"
    fi
done

Ejercicio 9: Script de Deploy

Automatiza el despliegue de una aplicación web.

bash
#!/bin/bash

set -e  # Salir en caso de error

APP_DIR="/var/www/miapp"
BACKUP_DIR="/backups"
REPO_URL="https://github.com/usuario/repo.git"

echo "=== Iniciando Deploy ==="

# Crear backup
if [ -d "$APP_DIR" ]; then
    echo "Creando backup..."
    tar -czf "$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).tar.gz" "$APP_DIR"
fi

# Clonar/Actualizar repositorio
if [ -d "$APP_DIR/.git" ]; then
    cd "$APP_DIR"
    git pull origin main
else
    git clone "$REPO_URL" "$APP_DIR"
fi

# Instalar dependencias
cd "$APP_DIR"
npm install --production

# Reiniciar servicio
sudo systemctl restart nginx

echo "=== Deploy Completado ==="

Ejercicio 10: Health Check de Servidores

Script que verifique el estado de múltiples servidores.

bash
#!/bin/bash

SERVIDORES=(
    "192.168.1.10:web01"
    "192.168.1.11:db01"
    "192.168.1.12:app01"
)

PUERTOS=(
    "web01:80,443"
    "db01:3306"
    "app01:8080,8443"
)

echo "=== Health Check $(date) ==="

for servidor in "${SERVIDORES[@]}"; do
    IP=$(echo $servidor | cut -d: -f1)
    NOMBRE=$(echo $servidor | cut -d: -f2)
    
    if ping -c 1 -W 1 $IP &>/dev/null; then
        echo "✓ $NOMBRE ($IP) - ONLINE"
    else
        echo "✗ $NOMBRE ($IP) - OFFLINE"
    fi
done

echo ""
echo "=== Verificación de Puertos ==="

for entrada in "${PUERTOS[@]}"; do
    NOMBRE=$(echo $entrada | cut -d: -f1)
    PUERTOS_LISTA=$(echo $entrada | cut -d: -f2)
    
    for puerto in $(echo $PUERTOS_LISTA | tr ',' ' '); do
        if nc -z 127.0.0.1 $puerto 2>/dev/null; then
            echo "✓ $NOMBRE:$puerto - ABIERTO"
        else
            echo "✗ $NOMBRE:$puerto - CERRADO"
        fi
    done
done

Ejercicios Prácticos

Práctica 1: Script de Inicialización

Crea un script que:

  1. Verifique si se ejecuta como root
  2. Actualice el sistema
  3. Instale paquetes básicos (git, curl, vim)
  4. Cree un usuario específico
  5. Configure el firewall básico

Práctica 2: Monitor de Logs

Desarrolla un script que:

  1. Monitoree un archivo de log en tiempo real
  2. Detecte patrones de error específicos
  3. Cuente la frecuencia de errores
  4. Envíe notificaciones si supera un threshold
  5. Genere un reporte diario

Práctica 3: Gestor de Servicios

Crea un script que:

  1. Liste todos los servicios del sistema
  2. Permita iniciar/parar/reiniciar servicios
  3. Verifique el estado de servicios críticos
  4. Genere alertas si un servicio está caído
  5. Guarde un historial de estados

Comandos Útiles para Recordar

bash
# Variables
$1, $2, $3    # Argumentos posicionales
$#            # Número de argumentos
$@            # Todos los argumentos
$?            # Código de salida del último comando
$$            # PID del script actual

# Estructuras de control
if [ condición ]; then
    # código
elif [ condición ]; then
    # código
else
    # código
fi

for i in {1..10}; do
    echo $i
done

while [ condición ]; do
    # código
done

case $variable in
    valor1) comando ;;
    valor2) comando ;;
    *) comando_por_defecto ;;
esac

# Operadores de comparación numérica
-eq  # igual
-ne  # diferente
-gt  # mayor que
-lt  # menor que
-ge  # mayor o igual
-le  # menor o igual

# Operadores de comparación de strings
=    # igual
!=   # diferente
-z   # string vacío
-n   # string no vacío

# Operadores de archivos
-e   # existe
-f   # es archivo regular
-d   # es directorio
-r   # tiene permiso de lectura
-w   # tiene permiso de escritura
-x   # tiene permiso de ejecución

Recursos Adicionales

Publicado bajo la licencia MIT.