1. Estructura básica de un script Bash
Todo script Bash comienza con el shebang, una línea especial que le dice al sistema operativo qué intérprete usar para ejecutar el archivo. Sin esta línea, el script podría ejecutarse con el shell equivocado o fallar completamente.
La línea set -euo pipefail es crucial y muchos tutoriales la omiten. Veamos qué hace cada opción:
- -e: El script termina si cualquier comando falla (devuelve código distinto de 0).
- -u: El script falla si usas una variable no definida. Previene errores silenciosos.
- -o pipefail: Si un comando en un pipe falla, el pipe completo falla. Sin esto, comando_malo | grep algo podría ignorar el error.
💡 Consejo: Usa #!/usr/bin/env bash en lugar de #!/bin/bash. La versión con env busca Bash en el PATH del sistema, lo que hace el script más portátil entre distribuciones Linux y macOS.
2. Variables, argumentos y entrada del usuario
El manejo correcto de variables es la base de cualquier script robusto. En Bash, las variables no tienen tipos estrictos, lo que puede ser una fuente de bugs si no se tiene cuidado.
Observa el uso de ${VAR:-default} para valores por defecto y ${VAR:?mensaje} para requerir una variable. Estas son expansiones de parámetros de Bash que hacen tus scripts mucho más seguros.
3. Estructuras de control: condicionales y bucles
Los condicionales en Bash son más flexibles de lo que parecen. Aquí los patrones más útiles en la práctica:
4. Manejo robusto de errores
Un script de producción debe gestionar los errores de forma explícita. La combinación de set -e con un trap personalizado te da control total sobre qué ocurre cuando algo falla.
⚠️ Importante: El trap ... EXIT se ejecuta SIEMPRE al salir del script, ya sea por éxito, error o señal. Úsalo para limpiar archivos temporales, liberar locks o restaurar configuraciones.
5. Funciones y modularidad
Las funciones en Bash te permiten reutilizar código y hacer tus scripts más legibles. Un principio clave: cada función debería hacer una sola cosa y hacerla bien.
6. Automatización con cron jobs
Una vez que tu script funciona correctamente, el siguiente paso es programarlo para que se ejecute automáticamente. El servicio cron de Linux es la herramienta estándar para esto.
Para editar el crontab del usuario actual, ejecuta:
La sintaxis del crontab es minuto hora día-del-mes mes día-de-semana comando:
💡 Truco: Siempre redirige la salida del cron a un archivo de log (>> /var/log/mi_script.log 2>&1). Si no lo haces, cron intentará enviarte un correo, que en la mayoría de servidores no está configurado. Usa crontab.guru para generar y verificar expresiones cron visualmente.
7. Ejemplo real: script de backup automatizado
Aquí un script completo y listo para producción que combina todo lo anterior. Este script hace un backup incremental con rsync, mantiene solo los últimos N backups y registra toda la actividad en un log.
8. Buenas prácticas y checklist
Antes de poner un script en producción, verifica que cumple con estos puntos:
- ✅ Incluye #!/usr/bin/env bash y set -euo pipefail
- ✅ Todas las variables están entrecomilladas: "$VAR" no $VAR
- ✅ Usa readonly para constantes que no deben cambiar
- ✅ Implementa un trap para limpiar archivos temporales al salir
- ✅ Registra la actividad en un log con timestamps
- ✅ Valida que los archivos y directorios necesarios existen antes de empezar
- ✅ Comprueba que las dependencias externas (rsync, jq, etc.) están instaladas
- ✅ Prueba con --dry-run o bash -n script.sh antes de ejecutar en producción
- ✅ Usa shellcheck para detectar errores comunes automáticamente
- ✅ El script tiene permisos correctos: chmod 750 script.sh
🔧 Herramienta recomendada: Instala ShellCheck (apt install shellcheck) y úsalo sobre todos tus scripts antes de ponerlos en producción. Detecta automáticamente errores comunes de Bash que los ojos pasan por alto.
Conclusión
La automatización con Bash es una de las habilidades más valiosas que puede tener un administrador de sistemas o desarrollador que trabaja en entornos Linux. Un buen script no solo hace la tarea, sino que la hace de forma segura, registra lo que ocurre y falla de forma controlada cuando algo sale mal.
El siguiente paso natural es explorar herramientas como Ansible para automatización a mayor escala, o Python para scripts que requieren estructuras de datos más complejas. Pero para la mayoría de tareas del día a día en un servidor, Bash sigue siendo la herramienta perfecta.