Développement Bash
Modèles fondamentaux et meilleures pratiques pour le développement de scripts Bash 5.1+. Fournit des idiomes bash modernes, la gestion des erreurs, l'analyse des arguments et des alternatives purement bash aux commandes externes.
Fondamentaux du Script
Chaque script commence par l'en-tête essentiel :
#!/usr/bin/env bash
set -euo pipefail
Explication des options set :
-e- Quitter immédiatement en cas d'échec d'une commande-u- Traiter les variables non définies comme des erreurs-o pipefail- Le pipeline échoue si une commande échoue
Modèle de Métadonnées du 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
Gestion des Erreurs
Implémentez une gestion des erreurs basée sur trap pour des scripts robustes.
Analyse des Arguments
Modèle standard d'analyse des arguments.
Meilleures Pratiques pour les Variables
Utilisez toujours les accolades et citez les variables :
# Correct
"${variable}"
"${array[@]}"
# Incorrect
$variable
${array[*]} # Utilisez [@] pour une itération correcte
Utilisez readonly pour les constantes :
readonly CONFIG_FILE="/etc/app/config"
readonly -a VALID_OPTIONS=("opt1" "opt2" "opt3")
Remarque : N'utilisez jamais readonly dans les scripts sourcés – cela provoque des erreurs lors du re-sourçage.
Opérations sur les Chaînes (Bash Pur)
Préférez l'expansion native des paramètres bash aux outils externes :
# Supprimer les espaces
supprime="${string#"${string%%[![:space:]]*}"}"
supprime="${supprime%"${supprime##*[![:space:]]}"}"
# Minuscule/Majuscule (Bash 4+)
minuscule="${string,,}"
majuscule="${string^^}"
# Extraction de sous-chaîne
sous_chaine="${string:0:10}" # 10 premiers caractères
suffixe="${string: -5}" # 5 derniers caractères
# Remplacement de motifs
remplace="${string//ancien/nouveau}" # Remplacer tout
remplace="${string/ancien/nouveau}" # Remplacer le premier
# Supprimer le préfixe/suffixe
sans_prefixe="${string#prefixe}" # Correspondance la plus courte
sans_prefixe="${string##*/}" # Correspondance la plus longue (nom de base)
sans_suffixe="${string%suffixe}" # Correspondance la plus courte
sans_suffixe="${string%%/*}" # Correspondance la plus longue
Opérations sur les Tableaux
# Déclaration
declare -a tableau_indice=()
declare -A tableau_associatif=()
# Itération sécurisée avec nullglob
shopt -s nullglob
for fichier in *.txt; do
traiter "${fichier}"
done
shopt -u nullglob
# Longueur du tableau
longueur="${#tableau[@]}"
# Ajouter un élément
tableau+=("nouvel_element")
# Itérer avec un indice
for i in "${!tableau[@]}"; do
printf '%d : %s\n' "${i}" "${tableau[i]}"
done
Opérations sur les Fichiers
# Lire un fichier dans une chaîne
contenu="$(<"${fichier}")"
# Lire un fichier dans un tableau (Bash 4+)
mapfile -t lignes < "${fichier}"
# Vérifier les conditions sur les fichiers
[[ -f "${fichier}" ]] # Le fichier régulier existe
[[ -d "${repertoire}" ]] # Le répertoire existe
[[ -r "${fichier}" ]] # Lisible
[[ -w "${fichier}" ]] # Inscriptible
[[ -x "${fichier}" ]] # Exécutable
[[ -s "${fichier}" ]] # Non vide
# Création sécurisée d'un fichier temporaire
fichier_temp=$(mktemp)
trap 'rm -f "${fichier_temp}"' EXIT
Expressions Conditionnelles
Utilisez [[ ]] pour les conditionnelles (spécifiques à bash, plus puissantes) :
# Comparaisons de chaînes
[[ "${var}" == "valeur" ]] # Égalité
[[ "${var}" == motif* ]] # Correspondance par motif
[[ "${var}" =~ ^regex$ ]] # Correspondance par expression régulière
# Comparaisons numériques
(( num > 10 )) # Comparaison arithmétique
[[ "${num}" -gt 10 ]] # Syntaxe traditionnelle
# Conditions composées
[[ -f "${fichier}" && -r "${fichier}" ]]
[[ "${opt}" == "a" || "${opt}" == "b" ]]
Fonctions Utilitaires
Directives de Performance
- Utilisez les commandes intégrées plutôt que les commandes externes lorsque c'est possible
- Regroupez les opérations plutôt que les boucles pour les grands ensembles de données
- Utilisez
printfplutôt queechopour la portabilité et le contrôle - Évitez les sous-shells inutiles dans les boucles serrées
- Utilisez
[[ ]]plutôt que[ ]pour les comparaisons de chaînes
Ressources Supplémentaires
Fichiers de Référence
Pour des modèles et exemples détaillés :
- bash_example_file.sh - Modèle de script complet
- bash_example_includes.bash - Fonctions utilitaires réutilisables
- bash-agent-notes.md - Conseils de révision contextuels
- pure-bash-bible-strings.md - Modèles de manipulation de chaînes
- pure-bash-bible-arrays.md - Opérations sur les tableaux
- pure-bash-bible-files.md - Modèles de gestion de fichiers
- pure-bash-bible-variables.md - Référence d'expansion des paramètres