Diferència entre revisions de la pàgina «Teoria Bash 01: Repàs i Funcions»

De binefa.com
Salta a la navegació Salta a la cerca
(Es crea la pàgina amb «= Teoria Bash 01: Repàs i Funcions = == 1. Repàs de conceptes bàsics == === Variables === # Assignació (sense espais!) nom="Joan" edat=25 # Ús...».)
 
 
(Hi ha 2 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
 
= Teoria Bash 01: Repàs i Funcions =
 
= Teoria Bash 01: Repàs i Funcions =
  
 +
== 0. Ordres noves i document en html ==
 +
* Ordres noves: [https://www.tutorialspoint.com/unix_commands/local.htm local], [https://www.geeksforgeeks.org/linux-unix/shell-scripting-readonly-command/ readonly], [https://www.geeksforgeeks.org/linux-unix/tee-command-linux-example/ tee], [https://www.geeksforgeeks.org/linux-unix/basename-command-in-linux-with-examples/ basename] i [https://www.geeksforgeeks.org/linux-unix/shift-command-in-linux-with-examples/ shift])
 +
* [https://binefa.com/asix2/pj6/bash/teoriaBash01.html Aquest document en html]
 
== 1. Repàs de conceptes bàsics ==
 
== 1. Repàs de conceptes bàsics ==
  
Línia 417: Línia 420:
 
== 5. Consells i bones pràctiques ==
 
== 5. Consells i bones pràctiques ==
  
1. '''Sempre usar '''''INLINE''CODE''4'''''''' per a variables dins de funcions
+
* '''Sempre usar '''''INLINE''CODE''4'''''''' per a variables dins de funcions
2. '''Validar paràmetres''' abans de processar-los
+
* '''Validar paràmetres''' abans de processar-los
3. '''Retornar codis d'error significatius''' (0 = èxit, >0 = error)
+
* '''Retornar codis d'error significatius''' (0 = èxit, >0 = error)
4. '''Documentar les funcions''' amb comentaris
+
* '''Documentar les funcions''' amb comentaris
5. '''Usar noms descriptius''' per a funcions i variables
+
* '''Usar noms descriptius''' per a funcions i variables
6. '''Evitar efectes secundaris''' quan sigui possible
+
* '''Evitar efectes secundaris''' quan sigui possible
7. '''Una funció, una tasca''' (principi de responsabilitat única)
+
* '''Una funció, una tasca''' (principi de responsabilitat única)
  
 
== Resum ==
 
== Resum ==

Revisió de 11:34, 29 gen 2026

Teoria Bash 01: Repàs i Funcions

0. Ordres noves i document en html

1. Repàs de conceptes bàsics

Variables

# Assignació (sense espais!)
nom="Joan"
edat=25

# Ús de variables
echo "Hola $nom"
echo "Tens ${edat} anys"

# Variables d'entorn
export PATH="/usr/local/bin:$PATH"

# Llegir input de l'usuari
read -p "Introdueix el teu nom: " nom


Condicionals

# Sintaxi bàsica
if [ condició ]; then
    # codi
elif [ altra_condició ]; then
    # altre codi
else
    # codi alternatiu
fi

# Operadors de comparació numèrica
# -eq (igual), -ne (diferent), -lt (menor), -le (menor o igual)
# -gt (major), -ge (major o igual)

if [ $edat -ge 18 ]; then
    echo "Ets major d'edat"
fi

# Operadors de comparació de strings
# = (igual), != (diferent), -z (buit), -n (no buit)

if [ "$nom" = "Joan" ]; then
    echo "Hola Joan!"
fi

# Operadors de fitxers
# -f (fitxer existeix), -d (directori existeix)
# -r (llegible), -w (escrivible), -x (executable)

if [ -f "/etc/passwd" ]; then
    echo "El fitxer existeix"
fi

# Operadors lògics
# -a (AND), -o (OR), ! (NOT)
# També es pot usar && i ||

if [ $edat -ge 18 ] && [ "$nom" != "" ]; then
    echo "Dades vàlides"
fi


Bucles

# Bucle for amb llista
for nom in Joan Maria Pere; do
    echo "Hola $nom"
done

# Bucle for amb rang
for i in {1..10}; do
    echo "Número $i"
done

# Bucle for estil C
for ((i=0; i<10; i++)); do
    echo "Comptador: $i"
done

# Bucle while
contador=0
while [ $contador -lt 5 ]; do
    echo "Valor: $contador"
    ((contador++))
done

# Llegir fitxer línia per línia
while IFS= read -r linia; do
    echo "Línia: $linia"
done < fitxer.txt


2. Funcions en Bash

Definició de funcions

Hi ha dues sintaxis per definir funcions:


# Sintaxi 1 (més comuna)
nom_funcio() {
    # codi de la funció
}

# Sintaxi 2
function nom_funcio {
    # codi de la funció
}


Exemple bàsic

#!/bin/bash

saludar() {
    echo "Hola des de la funció!"
}

# Cridar la funció
saludar


Paràmetres de funcions

Les funcions reben paràmetres igual que els scripts:


saludar() {
    echo "Hola $1!"
    echo "Tens $2 anys"
}

# Cridar amb paràmetres
saludar "Joan" 25

# Variables especials per a paràmetres:
# $1, $2, $3... - paràmetres individuals
# $@ - tots els paràmetres com a paraules separades
# $* - tots els paràmetres com a una sola cadena
# $# - nombre de paràmetres


Exemple amb múltiples paràmetres

mostrar_info() {
    echo "Nombre de paràmetres: $#"
    echo "Primer paràmetre: $1"
    echo "Segon paràmetre: $2"
    echo "Tots els paràmetres: $@"
}

mostrar_info un dos tres quatre


Retornar valors

En Bash, les funcions no retornen valors com en altres llenguatges. Hi ha dues maneres principals:

1. Usar INLINECODE0 (només per a codis d'estat 0-255)

es_parell() {
    local num=$1
    if [ $((num % 2)) -eq 0 ]; then
        return 0  # èxit (true)
    else
        return 1  # error (false)
    fi
}

# Comprovar el resultat
if es_parell 4; then
    echo "4 és parell"
fi

# O capturar el codi de retorn
es_parell 5
resultat=$?
echo "Codi de retorn: $resultat"


2. Usar INLINECODE1 (per retornar dades)

sumar() {
    local a=$1
    local b=$2
    local suma=$((a + b))
    echo $suma
}

# Capturar el resultat amb $()
resultat=$(sumar 5 3)
echo "La suma és: $resultat"


Scope de variables: INLINECODE2 vs global

# Variable global
variable_global="Sóc global"

funcio_exemple() {
    # Variable local (només visible dins la funció)
    local variable_local="Sóc local"

    # Modificar variable global
    variable_global="He estat modificada"

    echo "Dins la funció:"
    echo "  Global: $variable_global"
    echo "  Local: $variable_local"
}

funcio_exemple

echo "Fora de la funció:"
echo "  Global: $variable_global"
echo "  Local: $variable_local"  # Estarà buida!


Bones pràctiques:

  • Sempre usar INLINECODE3 per a variables dins de funcions
  • Només usar variables globals quan calgui compartir estat
  • Noms descriptius per a les funcions

Exemple complet d'una funció útil

#!/bin/bash

# Funció que comprova si un fitxer existeix i és llegible
comprovar_fitxer() {
    local fitxer=$1

    if [ -z "$fitxer" ]; then
        echo "Error: Cal especificar un fitxer"
        return 1
    fi

    if [ ! -f "$fitxer" ]; then
        echo "Error: El fitxer $fitxer no existeix"
        return 2
    fi

    if [ ! -r "$fitxer" ]; then
        echo "Error: El fitxer $fitxer no és llegible"
        return 3
    fi

    echo "El fitxer $fitxer és vàlid"
    return 0
}

# Exemple d'ús
comprovar_fitxer "/etc/passwd"
echo "Codi de retorn: $?"

comprovarfitxer "/fitxerinexistent"
echo "Codi de retorn: $?"


Funcions amb validació de paràmetres

dividir() {
    # Comprovar que tenim 2 paràmetres
    if [ $# -ne 2 ]; then
        echo "Error: Cal proporcionar exactament 2 números"
        return 1
    fi

    local dividend=$1
    local divisor=$2

    # Comprovar divisió per zero
    if [ $divisor -eq 0 ]; then
        echo "Error: No es pot dividir per zero"
        return 2
    fi

    # Fer la divisió
    local resultat=$((dividend / divisor))
    echo $resultat
    return 0
}

# Ús
resultat=$(dividir 10 2)
if [ $? -eq 0 ]; then
    echo "Resultat: $resultat"
fi


3. Organització del codi amb funcions

Estructura recomanada d'un script

#!/bin/bash

#############################################
# Script: exemple.sh
# Descripció: Exemple d'estructura de script
# Autor: El teu nom
# Data: 2024-01-08
#############################################

# Variables globals
readonly SCRIPTDIR="$(cd "$(dirname "${BASHSOURCE[0]}")" && pwd)"
readonly LOG_FILE="/var/log/script.log"

#############################################
# Funcions auxiliars
#############################################

mostrar_ajuda() {
    cat << EOF
Ús: $(basename $0) [opcions]

Opcions:
    -h, --help      Mostra aquesta ajuda
    -v, --verbose   Mode verbós
    -f FITXER       Especifica un fitxer
EOF
}

log() {
    local missatge=$1
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $missatge" | tee -a "$LOG_FILE"
}

#############################################
# Funcions principals
#############################################

processar_dades() {
    local fitxer=$1
    log "Processant $fitxer..."
    # Codi de processament aquí
}

#############################################
# Programa principal
#############################################

main() {
    # Comprovar arguments
    if [ $# -eq 0 ]; then
        mostrar_ajuda
        exit 1
    fi

    # Processar opcions
    while [ $# -gt 0 ]; do
        case $1 in
            -h|--help)
                mostrar_ajuda
                exit 0
                ;;
            -f)
                processar_dades "$2"
                shift 2
                ;;
            *)
                echo "Opció desconeguda: $1"
                mostrar_ajuda
                exit 1
                ;;
        esac
    done
}

# Executar programa principal
main "$@"


4. Ús de colors al terminal

Exemple d'ús de colors

# Definició de colors (ANSI)
readonly CL_VERD='\033[0;32m'
readonly CL_VERMELL='\033[0;31m'
readonly CL_GROC='\033[0;33m'
readonly CL_RESET='\033[0m' # Torna al color normal
readonly LOG_FILE="nouLog.log"

log() {
    local nivell=$1
    local missatge=$2
    local data=$(date '+%Y-%m-%d %H:%M:%S')
    local color=""

    # Escollir color segons el nivell
    case "$nivell" in
        "INFO")  color=$CL_VERD ;;
        "ERROR") color=$CL_VERMELL ;;
        "WARN")  color=$CL_GROC ;;
        *)       color=$CL_RESET ;;
    esac

    # 1. Imprimir a la pantalla AMB colors
    echo -e "${color}[$data] [$nivell] $missatge${CL_RESET}"

    # 2. Guardar al fitxer SENSE colors (perquè sigui llegible amb qualsevol editor)
    echo "[$data] [$nivell] $missatge" >> "$LOG_FILE"
}

# --- Mock de funcionament ---
log "INFO" "El sistema s'ha iniciat correctament."
log "WARN" "L'espai de disc és inferior al 10%."
log "ERROR" "No s'ha pogut escriure al directori de destí."


5. Consells i bones pràctiques

  • Sempre usar INLINECODE4''' per a variables dins de funcions
  • Validar paràmetres abans de processar-los
  • Retornar codis d'error significatius (0 = èxit, >0 = error)
  • Documentar les funcions amb comentaris
  • Usar noms descriptius per a funcions i variables
  • Evitar efectes secundaris quan sigui possible
  • Una funció, una tasca (principi de responsabilitat única)

Resum

  • Les funcions organitzen el codi en blocs reutilitzables
  • Reben paràmetres amb INLINECODE5, INLINECODE6, etc.
  • Retornen codis amb INLINECODE7 (0-255)
  • Retornen dades amb INLINECODE8 i captura amb INLINECODE9
  • Usar INLINECODE10 per a variables dins de funcions
  • Sempre validar paràmetres i gestionar errors