Diferència entre revisions de la pàgina «Exercicis Bash 01: Funcions»

De binefa.com
Salta a la navegació Salta a la cerca
 
(Hi ha 4 revisions intermèdies del mateix usuari que no es mostren)
Línia 5: Línia 5:
 
== Exercici 1: Calculadora modular (30 minuts) ==
 
== Exercici 1: Calculadora modular (30 minuts) ==
  
Crea un script '''''INLINE''CODE''0''''' que implementi una calculadora bàsica amb funcions.
+
Crea un script '''calculadora.sh''' que implementi una calculadora bàsica amb funcions.
  
 
=== Requisits ===
 
=== Requisits ===
Línia 71: Línia 71:
 
== Exercici 2: Validador de fitxers (30 minuts) ==
 
== Exercici 2: Validador de fitxers (30 minuts) ==
  
Crea un script '''''INLINE''CODE''5''''' amb una funció que comprova l'estat d'un fitxer.
+
Crea un script '''validador.sh''' amb una funció que comprova l'estat d'un fitxer.
  
 
=== Requisits ===
 
=== Requisits ===
  
1. Crear una funció '''''INLINE''CODE''6''''' que:
+
1. Crear una funció '''validar_fitxer()''' que:
 
   * Rep un camí de fitxer com a paràmetre
 
   * Rep un camí de fitxer com a paràmetre
 
   * Comprova si el fitxer existeix
 
   * Comprova si el fitxer existeix
Línia 96: Línia 96:
  
 
=== Exemple d'execució ===
 
=== Exemple d'execució ===
 
  
 
  ./validador.sh /etc/passwd /tmp/fitxer_inexistent /bin/bash
 
  ./validador.sh /etc/passwd /tmp/fitxer_inexistent /bin/bash
Línia 102: Línia 101:
 
  === Validant /etc/passwd ===
 
  === Validant /etc/passwd ===
 
  ✓ El fitxer existeix
 
  ✓ El fitxer existeix
 
 
  ✓ És un fitxer regular
 
  ✓ És un fitxer regular
 
 
  ✓ És llegible
 
  ✓ És llegible
 
 
  ✗ No és escrivible
 
  ✗ No és escrivible
 
 
  ✗ No és executable
 
  ✗ No és executable
 
 
  Mida: 2847 bytes
 
  Mida: 2847 bytes
 
 
  Estat: VÀLID (codi 0)
 
  Estat: VÀLID (codi 0)
 
   
 
   
 
  === Validant /tmp/fitxer_inexistent ===
 
  === Validant /tmp/fitxer_inexistent ===
 
  ✗ El fitxer no existeix
 
  ✗ El fitxer no existeix
 
 
  Estat: ERROR (codi 2)
 
  Estat: ERROR (codi 2)
 
   
 
   
 
  === Validant /bin/bash ===
 
  === Validant /bin/bash ===
 
  ✓ El fitxer existeix
 
  ✓ El fitxer existeix
 
 
  ✓ És un fitxer regular
 
  ✓ És un fitxer regular
 
 
  ✓ És llegible
 
  ✓ És llegible
 
 
  ✗ No és escrivible
 
  ✗ No és escrivible
 
 
  ✓ És executable
 
  ✓ És executable
 
 
  Mida: 1234567 bytes
 
  Mida: 1234567 bytes
 
 
  Estat: VÀLID (codi 0)
 
  Estat: VÀLID (codi 0)
 
   
 
   
 
  === RESUM ===
 
  === RESUM ===
 
  Total fitxers: 3
 
  Total fitxers: 3
 
 
  Vàlids: 2
 
  Vàlids: 2
 
 
  Errors: 1
 
  Errors: 1
 
  
 
=== Ajuda ===
 
=== Ajuda ===
Línia 173: Línia 156:
 
== Exercici 3: Generador de backups bàsic (30 minuts) ==
 
== Exercici 3: Generador de backups bàsic (30 minuts) ==
  
Crea un script '''''INLINE''CODE''7''''' que generi còpies de seguretat d'un directori.
+
Crea un script '''backup.sh''' que generi còpies de seguretat d'un directori.
  
 
=== Requisits ===
 
=== Requisits ===
  
1. Crear una funció '''''INLINE''CODE''8''''' que:
+
1. Crear una funció '''fer_backup()''' que:
 
   * Rep com a paràmetres:
 
   * Rep com a paràmetres:
 
     * Directori origen
 
     * Directori origen
Línia 183: Línia 166:
 
   * Valida que el directori origen existeix
 
   * Valida que el directori origen existeix
 
   * Crea el directori destinació si no existeix
 
   * Crea el directori destinació si no existeix
   * Genera un fitxer tar.gz amb el format: '''''INLINE''CODE''9'''''
+
   * Genera un fitxer tar.gz amb el format: '''backup_NOMDIR_YYYYMMDD_HHMMSS.tar.gz'''
 
   * Mostra la mida del backup creat
 
   * Mostra la mida del backup creat
 
   * Retorna 0 si tot va bé, >0 si hi ha error
 
   * Retorna 0 si tot va bé, >0 si hi ha error
  
2. Crear una funció '''''INLINE''CODE''10''''' que:
+
2. Crear una funció '''llistar_backups()''' que:
 
   * Rep el directori de backups
 
   * Rep el directori de backups
 
   * Llista tots els backups disponibles amb la seva mida i data
 
   * Llista tots els backups disponibles amb la seva mida i data
  
 
3. El programa principal ha de:
 
3. El programa principal ha de:
   * Acceptar opcions: '''''INLINE''CODE''11''''' (fer backup), '''''INLINE''CODE''12''''' (llistar)
+
   * Acceptar opcions: '''-b''' (fer backup), '''-l''' (llistar)
 
   * Mostrar ajuda si no hi ha paràmetres
 
   * Mostrar ajuda si no hi ha paràmetres
  
Línia 278: Línia 261:
 
Crea un script amb funcions per gestionar logs:
 
Crea un script amb funcions per gestionar logs:
  
1. '''''INLINE''CODE''13''''' - escriu un missatge informatiu
+
1. '''log_info()''' - escriu un missatge informatiu
  
2. '''''INLINE''CODE''14''''' - escriu un missatge d'error
+
2. '''log_error()''' - escriu un missatge d'error
  
3. '''''INLINE''CODE''15''''' - escriu un missatge d'avís
+
3. '''log_warning()''' - escriu un missatge d'avís
  
4. '''''INLINE''CODE''16''''' - llegeix i filtra logs per tipus
+
4. '''llegir_logs()''' - llegeix i filtra logs per tipus
  
 
Cada missatge ha de tenir:
 
Cada missatge ha de tenir:

Revisió de 11:52, 29 gen 2026

Exercicis Bash 01: Funcions

Aquest document en html

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/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. 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:

  • 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%)