Generador de scripts Bash

Crea scripts Bash robustos con set -Eeuo pipefail, logging, flock y plantillas de backup, limpieza, healthcheck o deploy.

toolboox.app/herramientas/bash-script-generator

Herramienta

backup-diario.sh

Qué problema resuelve

La mayoría de scripts de producción fallan en silencio por no usar modo estricto ni bloqueos.

Un script de Bash mal escrito falla en silencio, borra ficheros por un espacio olvidado en una variable o deja procesos huérfanos cuando el sistema se reinicia a mitad de ejecución. Este generador de scripts Bash construye plantillas con las cabeceras de seguridad recomendadas (set -euo pipefail), manejo de argumentos, logging y trampas de limpieza, para que no tengas que recordar cada convención cada vez que automatizas una tarea de sysadmin.

set -euo pipefail: la primera línea que evita el 90% de bugs

set -e detiene el script en el primer comando que falla, en vez de seguir ejecutando con datos corruptos. set -u convierte el uso de una variable no definida en un error inmediato, evitando el clásico rm -rf $DIR/* cuando DIR está vacío y borra la raíz del sistema de ficheros. set -o pipefail propaga el código de salida de cualquier comando en un pipe, no solo del último; sin esto, comando_que_falla | grep algo puede devolver éxito aunque el primer comando haya fallado. Estas tres opciones deberían ser el estándar en cualquier script de producción.

Manejo de argumentos con getopts

getopts es el builtin de Bash para parsear opciones cortas (-f, -v, -h) de forma robusta, sin depender de utilidades externas como getopt que varían entre distribuciones. Un script bien construido valida que los argumentos obligatorios estén presentes, muestra un mensaje de uso claro con -h y falla con un código de salida distinto de cero cuando falta un parámetro requerido. Evita parsear $1, $2, $3 posicionalmente si el script admite más de dos o tres opciones: se vuelve ilegible y frágil ante cambios de orden.

trap para limpieza garantizada

trap 'cleanup' EXIT ejecuta una función de limpieza sin importar cómo termine el script: éxito, fallo o interrupción con Ctrl+C (SIGINT). Es la forma correcta de borrar ficheros temporales, liberar locks o cerrar conexiones SSH abiertas. Sin trap, un script interrumpido a mitad de un mktemp deja basura acumulándose en /tmp indefinidamente, algo habitual en cron jobs que fallan silenciosamente durante meses.

Logging estructurado y códigos de salida

Un script que solo hace echo mezclado con la salida de los comandos es imposible de depurar en un cron a las 3 de la mañana. Define una función log() que anteponga timestamp y nivel (INFO, WARN, ERROR) y redirige stderr por separado con >&2 para los mensajes de error. Usa códigos de salida distintos para cada tipo de fallo (1 para argumentos inválidos, 2 para fallo de conexión, 3 para timeout) para que el sistema que invoca el script pueda reaccionar de forma diferenciada.

Comprobación de dependencias antes de ejecutar

Un script que asume que curl, jq o rsync están instalados fallará de forma confusa en un servidor recién aprovisionado. Comprueba con command -v herramienta >/dev/null || { echo 'falta herramienta'; exit 1; } al inicio del script, antes de ejecutar cualquier lógica de negocio. Esto convierte un fallo críptico a mitad de ejecución en un mensaje claro desde el primer segundo.

Shellcheck: el linter que detecta errores antes de producción

ShellCheck analiza estáticamente scripts de shell y detecta problemas como variables sin comillas ($var en vez de "$var", que rompe con espacios), comparaciones erróneas y uso incorrecto de arrays. Integrarlo en el pipeline de CI antes de desplegar cualquier script de automatización detecta en segundos errores que de otro modo aparecerían como incidentes en producción semanas después.

Cuándo Bash se queda corto y toca cambiar de herramienta

Bash es idóneo para orquestar comandos existentes, pero si el script empieza a manejar estructuras de datos complejas, JSON anidado o lógica condicional extensa, es momento de migrar a Python o a un playbook de Ansible. Si el objetivo final es desplegar infraestructura repetible en contenedores, complementa este generador con el generador de manifiestos de Kubernetes o con el generador de playbooks de Ansible para automatización declarativa en vez de imperativa.

Casos de uso comunes

  • Automatizar backups programados con rotación y logging.
  • Construir scripts de despliegue que validen dependencias antes de ejecutar.
  • Crear utilidades de mantenimiento de servidores con manejo seguro de argumentos.
  • Envolver comandos de Docker o kubectl en scripts reutilizables por el equipo.
  • Generar plantillas base consistentes para todo el equipo de DevOps.

Buenas prácticas

  • Incluye siempre set -euo pipefail al inicio de cualquier script nuevo.
  • Usa trap para garantizar limpieza de temporales incluso si el script falla.
  • Valida dependencias externas (curl, jq, rsync) antes de ejecutar lógica de negocio.
  • Pasa todo por ShellCheck antes de fusionar cambios a producción.
  • Entrecomilla siempre las variables ($var como "$var") para evitar word splitting.

Preguntas frecuentes

¿Por qué set -Eeuo pipefail?

Aborta ante errores, variables no definidas y fallos en tuberías, y propaga el trap ERR a funciones. Evita que un script continúe con estado corrupto.

¿Para qué sirve flock?

Impide ejecuciones solapadas cuando cron lanza el script antes de que termine la ejecución anterior.