Buenas practicas de Bash
Guia rapida para escribir shell scripts mantenibles y seguros en entornos DevOps.
Estilo y legibilidad
- Indentacion consistente (2 espacios).
- Comillas en expansiones:
"$var". [[ ]]para tests en bash.- Nombres claros:
backup_database, nobd. - Comentarios solo en logica no obvia.
Herramientas
| Herramienta | Uso |
|---|---|
| shellcheck | Lint estatico |
| shfmt | Formateo |
| bats | Tests de shell |
| bashdb | Depuracion |
bash
shellcheck deploy.shSeguridad
set -uevitarm -rf "$EMPTY"/.- No uses
evalcon input usuario. - Sanitiza argumentos antes de SQL/curl.
- Permisos minimos (usuario dedicado en cron).
- No guardes passwords en scripts; usa secret manager o env inyectado.
Portabilidad
#!/usr/bin/env bashpara bash.- Si necesitas POSIX, usa
#!/bin/shy evita arrays bash. - En macOS, prueba
dateysed(difieren de GNU). - En CI, fija imagen (
ubuntu-latest).
Cuando NO usar Bash
- Logica compleja -> Python, Go, TypeScript.
- Parsing JSON/HTML pesado ->
jq, Python. - API REST elaborada -> SDK o curl + jq con cuidado.
- Estado y concurrencia compleja -> servicio proper.
Bash es pegamento entre CLIs, no lenguaje de aplicacion grande.
Integracion con el stack
| Tarea | Recurso |
|---|---|
| CI/CD | CI/CD |
| GitHub Actions | GitHub Actions |
| SSH remoto | SSH |
| Ansible | Ansible |
| Terminal | Terminal |
Checklist de script listo para prod
- [ ]
set -euo pipefail - [ ] Shebang correcto
- [ ] Uso documentado
- [ ] Variables validadas
- [ ] Rutas absolutas desde script dir
- [ ] Logs a stdout/stderr o archivo
- [ ] Exit codes significativos
- [ ] shellcheck sin errores criticos
- [ ] Probado en entorno tipo produccion
Errores de veteranos que siguen pasando
- Script de 800 lineas sin funciones.
- Copy-paste de Stack Overflow sin
set -e. - Cron que falla silenciosamente anos.
- Depender de estado global en
/tmpsin lock. - Mezclar bash y zsh syntax.
Cierre
Bash sigue siendo indispensable en DevOps: rapido, universal y perfecto para automatizar lo que ya haces en terminal. Escribelo con disciplina (modo estricto, shellcheck, funciones pequenas) y delega logica pesada a lenguajes con mejor soporte para datos y tests.
