Curso de Shell Scripting
A medida que los scripts crecen, es crucial mantenerlos robustos, legibles y fáciles de depurar. Este módulo cubre herramientas y técnicas para detectar errores, aplicar buenas prácticas y rastrear problemas.
14.1. Errores comunes en scripts Bash
- Usar variables no definidas → genera errores inesperados.
- No comprobar códigos de salida → el script sigue ejecutando pese a fallos.
- No citar correctamente (
" "vs' '), causando problemas con espacios. - No limpiar archivos temporales → basura en el sistema.
- Usar rutas relativas sin control del directorio actual.
- No manejar errores de comandos críticos (
cp,rsync, etc.).
👉 Para evitar muchos de estos errores, ya aprendiste a usar:
1set -Eeuo pipefail
14.2. Linter para scripts: shellcheck
shellcheck analiza el código de un script y reporta problemas, malas prácticas y posibles errores.
▸ Instalación
En Ubuntu/Debian:
1sudo apt update 2sudo apt install shellcheck
En macOS:
1brew install shellcheck
▸ Uso básico
1shellcheck mi_script.sh
Salida típica:
In mi_script.sh line 5:
for f in $(ls *.txt)
^-- SC2045: Use 'for f in *.txt' instead of 'ls | ...'
👉 Muestra el número de línea y sugiere la corrección.
▸ Integración con editores
- VS Code: instala la extensión “ShellCheck” → te avisa en tiempo real.
- Vim/Neovim: usa el plugin
aleococ-shellcheck. - JetBrains: tiene soporte mediante plugins.
14.3. Formateador de código: shfmt
Para mantener un estilo consistente en el código.
▸ Instalación
Ubuntu/Debian:
1sudo apt install shfmt
macOS:
1brew install shfmt
▸ Formatear un script
1shfmt -w mi_script.sh
Opciones útiles:
-i 2→ indentación de 2 espacios-ci→ identa correctamente los bloquescase
Ejemplo:
1shfmt -w -i 2 mi_script.sh
14.4. Depuración con set -x
El modo traza (set -x) muestra cada comando que se ejecuta junto con los valores de las variables.
▸ Activar en todo el script
1#!/usr/bin/env bash 2set -Eeuo pipefail 3set -x # Activa el modo traza 4 5echo "Inicio" 6VAR=42 7echo "El valor es $VAR"
Salida:
+ echo 'Inicio'
Inicio
+ VAR=42
+ echo 'El valor es 42'
El valor es 42
▸ Activar solo en una sección
1set -x 2# Sección a depurar 3comando1 4comando2 5set +x
👉 set +x desactiva el modo traza.
14.5. Personalizar el prompt de depuración con PS4
Permite añadir contexto (línea y función) a los mensajes de traza.
1export PS4='+ (${BASH_SOURCE}:${LINENO}): ' 2set -x
Salida de ejemplo:
+ (mi_script.sh:5): VAR=42
+ (mi_script.sh:6): echo 'Valor=42'
14.6. Depuración con trap ERR
Permite capturar y reaccionar ante errores.
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4trap 'echo "❗ Error en la línea $LINENO"' ERR 5 6echo "Inicio" 7ls /no_existe 8echo "Fin"
Salida:
Inicio
ls: cannot access '/no_existe': No such file or directory
❗ Error en la línea 6
👉 El script muestra el número de línea donde falló.
14.7. Uso de time para medir rendimiento
Permite medir cuánto tarda en ejecutarse un comando o bloque de código.
1time sleep 3
Salida:
real 0m3.002s
user 0m0.001s
sys 0m0.000s
14.8. Ejemplo integrador: depuración de un backup
Script backup.sh:
1#!/usr/bin/env bash 2set -Eeuo pipefail 3trap 'echo "❗ Error en línea $LINENO"' ERR 4export PS4='+ (${BASH_SOURCE}:${LINENO}): ' 5 6LOG=backup.log 7SRC=~/documentos 8DEST=~/backups 9ARCHIVO=backup_$(date +%Y%m%d).tar.gz 10 11set -x 12mkdir -p "$DEST" 13tar -czf "$DEST/$ARCHIVO" "$SRC" >>"$LOG" 2>&1 14echo "✅ Backup completado: $DEST/$ARCHIVO" 15set +x
👉 Este script:
- Se detiene si falla cualquier comando.
- Informa del error y la línea exacta.
- Muestra trazas para depurar.
- Genera un log del proceso.
🏋️♂️ Ejercicio práctico 1
Crea un script analisis.sh que:
- Acepte como argumento la ruta a un archivo de texto.
- Muestre cuántas líneas, palabras y caracteres tiene.
- Use
set -xpara depurar y muestre las trazas. - Usa
shellcheckpara detectar problemas y corrígelos.
🏋️♂️ Ejercicio práctico 2
Crea un script procesa_csv.sh que:
- Procese un archivo CSV grande.
- Mida el tiempo que tarda en ejecutarse con
time. - Use
trap ERRpara mostrar un mensaje en caso de fallo. - Aplica
shfmtpara mantener un formato uniforme.
✅ Buenas prácticas
- ✅ Usa
shellcheckantes de desplegar scripts en producción. - ✅ Mantén un estilo consistente con
shfmt. - ✅ Activa
set -xsolo en depuración, no en producción. - ✅ Usa
trap ERRpara mostrar mensajes claros en fallos. - ✅ Documenta los scripts con comentarios y ejemplos de uso.
- Loading...