Funciones en Bash
Las funciones agrupan comandos con nombre, parametros y variables locales. Mejoran legibilidad y evitan duplicacion en scripts de deploy y mantenimiento.
Definicion basica
bash
#!/usr/bin/env bash
greet() {
echo "Hola, $1"
}
greet "Ana"Parametros y return
bash
backup_file() {
local src="$1"
local dest="$2"
if [[ ! -f "$src" ]]; then
echo "No existe: $src" >&2
return 1
fi
cp "$src" "$dest"
return 0
}
backup_file "/etc/app.conf" "/backup/app.conf"
echo "Exit: $?"return solo devuelve codigo numerico (0-255). Para texto usa echo y captura con $().
Capturar salida
bash
get_timestamp() {
date +%Y%m%d-%H%M%S
}
ts=$(get_timestamp)
echo "Backup-$ts.tar.gz"Variables locales
bash
counter=0
increment() {
local counter=$((counter + 1))
echo "local: $counter"
}
increment # local: 1
echo "global: $counter" # 0Sin local, modificas variables globales por accidente.
Funciones en librerias
lib/log.sh:
bash
log_info() {
echo "[INFO] $(date -Iseconds) $*"
}
log_error() {
echo "[ERROR] $(date -Iseconds) $*" >&2
}deploy.sh:
bash
#!/usr/bin/env bash
source "$(dirname "$0")/lib/log.sh"
log_info "Iniciando deploy"Usa rutas relativas al script con dirname "$0".
export -f (scripts avanzados)
bash
myfn() { echo "ok"; }
export -f myfn
# disponible en subshells de parallel (con cuidado)Documentar funciones
bash
# backup_dir SRC DEST
# Copia recursiva de SRC a DEST con tar.
backup_dir() {
local src="$1" dest="$2"
tar -czf "$dest" -C "$(dirname "$src")" "$(basename "$src")"
}Buenas practicas
- Nombres verbo_sustantivo:
deploy_app,check_health. localpara todas las variables internas.- Validar argumentos al inicio (
$#). - Mensajes de error a stderr (
>&2). sourcesolo archivos de confianza.
Errores habituales
- Olvidar que
$1en funcion no es$1del script si no pasas args. - Recursion sin caso base.
- Funciones gigantes (dividir en pasos).
sourcede script con efectos secundarios al cargar.- Usar
exitdentro de funcion sourced (mata el shell padre).
Siguiente paso
El capitulo 5 conecta comandos con pipes y maneja procesos en segundo plano.
