Exercicis Bash 01: Funcions

Exercici 1: Calculadora modular (30 minuts)

Crea un script calculadora.sh que implementi una calculadora bàsica amb funcions.

Requisits

  1. Crear les següents funcions:

    • sumar() - rep 2 números i retorna la suma
    • restar() - rep 2 números i retorna la resta
    • multiplicar() - rep 2 números i retorna el producte
    • dividir() - rep 2 números i retorna la divisió (gestionar divisió per zero)
  2. El programa principal ha de:

    • Mostrar un menú amb les 4 operacions + opció de sortir
    • Demanar a l'usuari els 2 números
    • Cridar la funció corresponent
    • Mostrar el resultat
    • Repetir fins que l'usuari esculli sortir

Exemple d'execució

=== CALCULADORA ===
1. Sumar
2. Restar
3. Multiplicar
4. Dividir
5. Sortir

Tria una opció: 1
Introdueix el primer número: 5
Introdueix el segon número: 3
Resultat: 8

Tria una opció: 4
Introdueix el primer número: 10
Introdueix el segon número: 0
Error: No es pot dividir per zero

Tria una opció: 5
Adéu!

Ajuda

# Estructura bàsica del menú
while true; do
    echo "=== CALCULADORA ==="
    echo "1. Sumar"
    # ...
    read -p "Tria una opció: " opcio
    
    case $opcio in
        1)
            # llegir números i cridar sumar
            ;;
        5)
            echo "Adéu!"
            exit 0
            ;;
    esac
done

Exercici 2: Validador de fitxers (30 minuts)

Crea un script validador.sh amb una funció que comprova l'estat d'un fitxer.

Requisits

  1. Crear una funció validar_fitxer() que:

    • Rep un camí de fitxer com a paràmetre
    • Comprova si el fitxer existeix
    • Comprova si és un fitxer regular (no un directori)
    • Comprova si és llegible
    • Comprova si és escrivible
    • Comprova si és executable
    • Mostra la mida del fitxer
    • Retorna diferents codis d'error segons el problema:
      • 0: Tot correcte
      • 1: No s'ha proporcionat paràmetre
      • 2: El fitxer no existeix
      • 3: És un directori, no un fitxer
      • 4: No és llegible
  2. El programa principal ha de:

    • Acceptar múltiples fitxers com a paràmetres
    • Validar cada fitxer
    • Mostrar un resum al final

Exemple d'execució

./validador.sh /etc/passwd /tmp/fitxer_inexistent /bin/bash

=== Validant /etc/passwd ===
✓ El fitxer existeix
✓ És un fitxer regular
✓ És llegible
✗ No és escrivible
✗ No és executable
Mida: 2847 bytes
Estat: VÀLID (codi 0)

=== Validant /tmp/fitxer_inexistent ===
✗ El fitxer no existeix
Estat: ERROR (codi 2)

=== Validant /bin/bash ===
✓ El fitxer existeix
✓ És un fitxer regular
✓ És llegible
✗ No és escrivible
✓ És executable
Mida: 1234567 bytes
Estat: VÀLID (codi 0)

=== RESUM ===
Total fitxers: 3
Vàlids: 2
Errors: 1

Ajuda

validar_fitxer() {
    local fitxer=$1
    
    echo "=== Validant $fitxer ==="
    
    # Comprovar si s'ha passat paràmetre
    if [ -z "$fitxer" ]; then
        echo "✗ No s'ha especificat fitxer"
        return 1
    fi
    
    # Comprovar existència
    if [ ! -e "$fitxer" ]; then
        echo "✗ El fitxer no existeix"
        return 2
    fi
    
    # Més comprovacions...
    
    return 0
}

Exercici 3: Generador de backups bàsic (30 minuts)

Crea un script backup.sh que generi còpies de seguretat d'un directori.

Requisits

  1. Crear una funció fer_backup() que:

    • Rep com a paràmetres:
      • Directori origen
      • Directori destinació (opcional, per defecte /tmp/backups)
    • Valida que el directori origen existeix
    • Crea el directori destinació si no existeix
    • Genera un fitxer tar.gz amb el format: backup_NOMDIR_YYYYMMDD_HHMMSS.tar.gz
    • Mostra la mida del backup creat
    • Retorna 0 si tot va bé, >0 si hi ha error
  2. Crear una funció llistar_backups() que:

    • Rep el directori de backups
    • Llista tots els backups disponibles amb la seva mida i data
  3. El programa principal ha de:

    • Acceptar opcions: -b (fer backup), -l (llistar)
    • Mostrar ajuda si no hi ha paràmetres

Exemple d'execució

./backup.sh -b /home/usuari/documents
Creant backup de /home/usuari/documents...
Directori de destinació: /tmp/backups
Arxiu creat: /tmp/backups/backup_documents_20240108_143055.tar.gz
Mida: 15.3 MB
Temps: 2.5 segons
Backup completat amb èxit!

./backup.sh -l
=== Backups disponibles a /tmp/backups ===
backup_documents_20240108_143055.tar.gz    15.3 MB    2024-01-08 14:30
backup_documents_20240107_091245.tar.gz    14.8 MB    2024-01-07 09:12
backup_projecte_20240106_183020.tar.gz     3.2 MB     2024-01-06 18:30

Total: 3 backups (33.3 MB)

Ajuda

fer_backup() {
    local origen=$1
    local desti=${2:-/tmp/backups}
    
    # Validar origen
    if [ ! -d "$origen" ]; then
        echo "Error: El directori $origen no existeix"
        return 1
    fi
    
    # Crear directori destinació
    mkdir -p "$desti"
    
    # Generar nom del fitxer
    local nom_dir=$(basename "$origen")
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local arxiu="backup_${nom_dir}_${timestamp}.tar.gz"
    local ruta_completa="$desti/$arxiu"
    
    # Crear backup
    echo "Creant backup de $origen..."
    local temps_inici=$(date +%s)
    
    tar -czf "$ruta_completa" -C "$(dirname "$origen")" "$(basename "$origen")" 2>/dev/null
    
    if [ $? -eq 0 ]; then
        local temps_fi=$(date +%s)
        local temps_total=$((temps_fi - temps_inici))
        local mida=$(du -h "$ruta_completa" | cut -f1)
        
        echo "Arxiu creat: $ruta_completa"
        echo "Mida: $mida"
        echo "Temps: $temps_total segons"
        return 0
    else
        echo "Error creant el backup"
        return 2
    fi
}

# Gestió d'opcions
case $1 in
    -b)
        fer_backup "$2" "$3"
        ;;
    -l)
        llistar_backups "${2:-/tmp/backups}"
        ;;
    *)
        mostrar_ajuda
        ;;
esac

Exercici extra (si hi ha temps): Sistema de logs

Crea un script amb funcions per gestionar logs:

  1. log_info() - escriu un missatge informatiu
  2. log_error() - escriu un missatge d'error
  3. log_warning() - escriu un missatge d'avís
  4. llegir_logs() - llegeix i filtra logs per tipus

Cada missatge ha de tenir:

log_info "Iniciant procés"
log_error "No s'ha pogut obrir el fitxer" 2
log_warning "Memòria al 85%"

Exemple de sortida al fitxer de log:

[2024-01-08 14:30:55] [INFO] Iniciant procés
[2024-01-08 14:30:56] [ERROR:2] No s'ha pogut obrir el fitxer
[2024-01-08 14:31:02] [WARNING] Memòria al 85%

Criteris d'avaluació