Bash avancé
Au-delà des bases, quelques outils et patterns permettent d'écrire des scripts de production : traitement de texte avec sed et awk, parsing d'arguments, here-documents, et gestion des cas limites.
Traitement de texte
sed : stream editor
sed 's/ancien/nouveau/g' fichier.txt # remplacer toutes les occurrences
sed -i 's/ancien/nouveau/g' fichier.txt # modification en place
sed -n '/pattern/p' fichier.txt # afficher les lignes matching
sed '/pattern/d' fichier.txt # supprimer les lignes matching
sed -i "s/PORT=22/PORT=${NOUVEAU_PORT}/" /etc/ssh/sshd_config # variable dans sedawk : traitement par colonnes
awk '{print $1}' fichier.txt # première colonne
awk '{print $1, $3}' fichier.txt # colonnes 1 et 3
awk -F: '{print $1}' /etc/passwd # délimiteur personnalisé (:)
awk -F: '$3 >= 1000 {print $1}' /etc/passwd # UID >= 1000 (utilisateurs réels)Parsing d'arguments
#!/bin/bash
set -euo pipefail
usage() {
echo "Usage: $0 [-h] [-e ENV] [-n NOM]"
exit 1
}
ENV="prod"
NOM=""
while getopts "he:n:" opt; do
case $opt in
e) ENV="$OPTARG" ;;
n) NOM="$OPTARG" ;;
h) usage ;;
*) usage ;;
esac
done
[ -n "$NOM" ] || usage
echo "Déploiement de $NOM sur $ENV"Here-documents
Les here-documents permettent d'écrire du contenu multi-lignes directement dans un script, avec interpolation des variables :
# Créer un fichier de configuration à partir de variables
cat > /etc/app/config.conf << EOF
HOST=${DB_HOST}
PORT=${DB_PORT}
NAME=${DB_NAME}
EOF
# Désactiver l'interpolation (littéral)
cat > /etc/app/template.conf << 'EOF'
HOST=${DB_HOST} # non interpolé
EOFVerrou et vérifications défensives
# Vérifier qu'une commande est disponible
command -v rsync &>/dev/null || apt install -y rsync
# Vérifier les dépendances au démarrage
check_deps() {
for cmd in rsync ssh jq; do
command -v "$cmd" &>/dev/null || die "Commande manquante : $cmd"
done
}
# Verrou pour éviter l'exécution simultanée
LOCKFILE=/tmp/mon-script.lock
exec 9>"$LOCKFILE"
flock -n 9 || die "Script déjà en cours d'exécution"En pratique
Un script de déploiement ou de sauvegarde en production doit gérer trois cas : l'exécution normale, l'échec d'une étape (trap EXIT), et l'exécution concurrente (flock). awk -F: '$3 >= 1000 {print $1}' /etc/passwd est le genre d'extraction qu'on utilise pour générer une liste d'utilisateurs à auditer. La combinaison sed -i + variables permet de templéter des fichiers de configuration sans recourir à des outils externes. À partir d'un certain seuil de complexité ou dès que plusieurs machines sont impliquées, Ansible prend le relais.