Teoria Bash 01: Repàs i Funcions
Salta a la navegació
Salta a la cerca
Contingut
- 1 Teoria Bash 01: Repàs i Funcions
- 1.1 0. Ordres noves i document en html
- 1.2 1. Repàs de conceptes bàsics
- 1.3 2. Funcions en Bash
- 1.4 3. Organització del codi amb funcions
- 1.5 4. Ús de colors al terminal
- 1.6 5. Consells i bones pràctiques
- 1.7 Resum
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