Diferència entre revisions de la pàgina «Exercicis Bash 01: Funcions»
| Línia 156: | Línia 156: | ||
== Exercici 3: Generador de backups bàsic (30 minuts) == | == Exercici 3: Generador de backups bàsic (30 minuts) == | ||
| − | Crea un script ''' | + | Crea un script '''backup.sh''' que generi còpies de seguretat d'un directori. |
=== Requisits === | === Requisits === | ||
| − | 1. Crear una funció ''' | + | 1. Crear una funció '''fer_backup()''' que: |
* Rep com a paràmetres: | * Rep com a paràmetres: | ||
* Directori origen | * Directori origen | ||
| Línia 166: | 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: ''' | + | * 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ó ''' | + | 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: ''' | + | * Acceptar opcions: '''-b''' (fer backup), '''-l''' (llistar) |
* Mostrar ajuda si no hi ha paràmetres | * Mostrar ajuda si no hi ha paràmetres | ||
Revisió del 11:45, 29 gen 2026
Contingut
Exercicis Bash 01: Funcions
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 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. 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%)