Exercicis Bash 01: Funcions

De binefa.com
Salta a la navegació Salta a la cerca

Exercicis Bash 01: Funcions

Aquest document en html

Exercici 1: Calculadora modular (30 minuts)

Crea un script INLINECODE0 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 INLINECODE7 que generi còpies de seguretat d'un directori.

Requisits

1. Crear una funció INLINECODE8 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: INLINECODE9
  * Mostra la mida del backup creat
  * Retorna 0 si tot va bé, >0 si hi ha error

2. Crear una funció INLINECODE10 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: INLINECODE11 (fer backup), INLINECODE12 (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/backupdocuments20240108_143055.tar.gz
Mida: 15.3 MB
Temps: 2.5 segons
Backup completat amb èxit!

./backup.sh -l
=== Backups disponibles a /tmp/backups ===
backupdocuments20240108_143055.tar.gz    15.3 MB    2024-01-08 14:30
backupdocuments20240107_091245.tar.gz    14.8 MB    2024-01-07 09:12
backupprojecte20240106_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${nomdir}_${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 tempstotal=$((tempsfi - 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. INLINECODE13 - escriu un missatge informatiu

2. INLINECODE14 - escriu un missatge d'error

3. INLINECODE15 - escriu un missatge d'avís

4. INLINECODE16 - llegeix i filtra logs per tipus

Cada missatge ha de tenir:

  • Timestamp
  • Tipus (INFO/ERROR/WARNING)
  • Missatge
  • Nivell de severitat (si és error)


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ó

  • Funcionalitat: Les funcions fan el que se'ls demana (40%)
  • Validació: Es comproven els paràmetres i errors (20%)
  • Codi net: Variables locals, noms descriptius, comentaris (20%)
  • Gestió d'errors: Codis de retorn apropiats (10%)
  • Usabilitat: Missatges clars per a l'usuari (10%)