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

  1. Usar variables no definidas → genera errores inesperados.
  2. No comprobar códigos de salida → el script sigue ejecutando pese a fallos.
  3. No citar correctamente (" " vs ' '), causando problemas con espacios.
  4. No limpiar archivos temporales → basura en el sistema.
  5. Usar rutas relativas sin control del directorio actual.
  6. 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 ale o coc-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 bloques case

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:

  1. Acepte como argumento la ruta a un archivo de texto.
  2. Muestre cuántas líneas, palabras y caracteres tiene.
  3. Use set -x para depurar y muestre las trazas.
  4. Usa shellcheck para detectar problemas y corrígelos.

🏋️‍♂️ Ejercicio práctico 2

Crea un script procesa_csv.sh que:

  1. Procese un archivo CSV grande.
  2. Mida el tiempo que tarda en ejecutarse con time.
  3. Use trap ERR para mostrar un mensaje en caso de fallo.
  4. Aplica shfmt para mantener un formato uniforme.

✅ Buenas prácticas

  1. ✅ Usa shellcheck antes de desplegar scripts en producción.
  2. ✅ Mantén un estilo consistente con shfmt.
  3. ✅ Activa set -x solo en depuración, no en producción.
  4. ✅ Usa trap ERR para mostrar mensajes claros en fallos.
  5. ✅ Documenta los scripts con comentarios y ejemplos de uso.
  • Loading...