Desarrollo Bash
Patrones básicos y mejores prácticas para el desarrollo de scripts Bash 5.1+. Proporciona modismos bash modernos, manejo de errores, análisis de argumentos y alternativas bash puras a comandos externos.
Fundamento del Script
Todo script comienza con el encabezado esencial:
#!/usr/bin/env bash
set -euo pipefail
Opciones set explicadas:
-e- Salir inmediatamente al fallar un comando-u- Tratar las variables no definidas como errores-o pipefail- La tubería falla si falla cualquier comando
Patrón de Metadatos del Script
SCRIPT_NAME=$(basename "${BASH_SOURCE[0]}")
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly SCRIPT_VERSION="1.0.0"
readonly SCRIPT_NAME SCRIPT_DIR
Manejo de Errores
Implementa un manejo de errores basado en trampas para scripts robustos.
Análisis de Argumentos
Plantilla estándar de análisis de argumentos.
Mejores Prácticas para Variables
Usa siempre llaves y entrecomilla las variables:
# Correcto
"${variable}"
"${array[@]}"
# Incorrecto
$variable
${array[*]} # Usa [@] para iteración correcta
Usa readonly para constantes:
readonly CONFIG_FILE="/etc/app/config"
readonly -a VALID_OPTIONS=("opt1" "opt2" "opt3")
Nota: Nunca uses readonly en scripts incluidos (sourced) - causa errores al volver a cargarlos.
Operaciones con Cadenas (Bash Puro)
Prefiere la expansión nativa de parámetros de bash sobre herramientas externas:
# Recortar espacios en blanco
trimmed="${string#"${string%%[![:space:]]*}"}"
trimmed="${trimmed%"${trimmed##*[![:space:]]}"}"
# Minúsculas/Mayúsculas (Bash 4+)
lower="${string,,}"
upper="${string^^}"
# Extracción de subcadenas
substring="${string:0:10}" # Primeros 10 caracteres
suffix="${string: -5}" # Últimos 5 caracteres
# Reemplazar patrones
replaced="${string//old/new}" # Reemplazar todos
replaced="${string/old/new}" # Reemplazar el primero
# Eliminar prefijo/sufijo
no_prefix="${string#prefix}" # Coincidencia más corta
no_prefix="${string##*/}" # Coincidencia más larga (basename)
no_suffix="${string%suffix}" # Coincidencia más corta
no_suffix="${string%%/*}" # Coincidencia más larga
Operaciones con Arreglos
# Declaración
declare -a indexed_array=()
declare -A assoc_array=()
# Iteración segura con nullglob
shopt -s nullglob
for file in *.txt; do
process "${file}"
done
shopt -u nullglob
# Longitud del arreglo
length="${#array[@]}"
# Añadir elemento
array+=("new_element")
# Iterar con índice
for i in "${!array[@]}"; do
printf '%d: %s\n' "${i}" "${array[i]}"
done
Operaciones con Archivos
# Leer archivo a una cadena
content="$(<"${file}")"
# Leer archivo a un arreglo (Bash 4+)
mapfile -t lines < "${file}"
# Verificar condiciones de archivos
[[ -f "${file}" ]] # El archivo regular existe
[[ -d "${dir}" ]] # El directorio existe
[[ -r "${file}" ]] # Legible
[[ -w "${file}" ]] # Escribible
[[ -x "${file}" ]] # Ejecutable
[[ -s "${file}" ]] # No vacío
# Creación segura de archivo temporal
temp_file=$(mktemp)
trap 'rm -f "${temp_file}"' EXIT
Expresiones Condicionales
Usa [[ ]] para condicionales (específico de bash, más potente):
# Comparaciones de cadenas
[[ "${var}" == "value" ]] # Igualdad
[[ "${var}" == pattern* ]] # Coincidencia de glob
[[ "${var}" =~ ^regex$ ]] # Coincidencia de expresión regular
# Comparaciones numéricas
(( num > 10 )) # Comparación aritmética
[[ "${num}" -gt 10 ]] # Sintaxis tradicional
# Condiciones compuestas
[[ -f "${file}" && -r "${file}" ]]
[[ "${opt}" == "a" || "${opt}" == "b" ]]
Funciones de Utilidad
Directrices de Rendimiento
- Usa comandos integrados en lugar de comandos externos cuando sea posible
- Agrupa operaciones en lugar de bucles para grandes conjuntos de datos
- Usa
printfen lugar deechopor portabilidad y control - Evita sub-shells innecesarias en bucles cerrados
- Usa
[[ ]]en lugar de[ ]para comparaciones de cadenas
Recursos Adicionales
Archivos de Referencia
Para patrones y ejemplos detallados:
- bash_example_file.sh - Plantilla de script completa
- bash_example_includes.bash - Funciones de utilidad reutilizables
- bash-agent-notes.md - Guía de revisión según contexto
- pure-bash-bible-strings.md - Patrones de manipulación de cadenas
- pure-bash-bible-arrays.md - Operaciones con arreglos
- pure-bash-bible-files.md - Patrones de manejo de archivos
- pure-bash-bible-variables.md - Referencia de expansión de parámetros