¿Qué hace bash-scripting?
Flujo de trabajo de scripting en Bash para crear scripts de shell listos para producción con patrones defensivos, manejo de errores y pruebas.
Características principales
- Patrones defensivos: Verificación de argumentos, uso de
set -euo pipefail, y validación de comandos requeridos. - Manejo de errores: Trampas (
trap) para limpiar archivos temporales y salir con código de error adecuado. - Pruebas: Soporte para pruebas unitarias con frameworks como
batso scripts de prueba personalizados. - Estructura modular: Separación de funciones en archivos incluidos (
source).
Requisitos
- Bash 4+ (o superior)
- Acceso a comandos estándar de Unix (grep, awk, sed, etc.)
- Opcional:
batspara ejecutar pruebas automatizadas
Uso básico
- Clonar el repositorio o copiar la plantilla de script:
git clone https://github.com/sickn33/bash-scripting.git
cp bash-scripting/template.sh mi-script.sh
-
Editar
mi-script.shpara agregar la lógica deseada. -
Hacerlo ejecutable y probar:
chmod +x mi-script.sh
./mi-script.sh --help
- Ejecutar pruebas:
bats tests/
Estructura del proyecto
.
├── template.sh # Plantilla principal del script
├── lib/ # Funciones reutilizables
│ ├── utils.sh
│ └── errors.sh
├── tests/ # Pruebas unitarias
│ ├── test_utils.bats
│ └── test_errors.bats
└── README.md # Documentación
Buenas prácticas incluidas
- Uso de
set -euo pipefailpara detener la ejecución en caso de errores. - Trampas de salida (
trap ... EXIT) para eliminar archivos temporales. - Mensajes de error descriptivos con
echocoloreado (opcional). - Validación de argumentos con funciones como
check_argsousage. - Separación de responsabilidades en funciones reutilizables.
Ejemplo de script con patrón defensivo
#!/bin/bash
set -euo pipefail
# Función de ayuda
usage() {
echo "Uso: $0 [-n nombre] [-v]"
exit 1
}
# Trampa para limpiar archivos temporales
cleanup() {
rm -f /tmp/mi_script_*
}
trap cleanup EXIT
# Validación de argumentos
if [[ $# -lt 1 ]]; then
usage
fi
# Procesar opciones
while getopts ":n:v" opt; do
case "${opt}" in
n) NOMBRE=${OPTARG} ;;
v) VERBOSE=true ;;
*) usage ;;
esac
done
echo "Hola, ${NOMBRE:-mundo}!"
Contribuir
Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request con mejoras.
Licencia
MIT - Ver el archivo LICENSE para más detalles.