Bash : exemples de scripts
Scripts complets à copier et adapter. Chacun applique les bonnes pratiques. Les chemins et noms sont fictifs. Penser à rendre le script exécutable (chmod +x) et à le tester dans un dossier d’essai avant tout usage réel.
1. Sauvegarde d’un dossier avec rotation
Section intitulée « 1. Sauvegarde d’un dossier avec rotation »Crée une archive datée et supprime celles de plus de 7 jours.
#!/usr/bin/env bashset -euo pipefail
SOURCE="${1:?Usage: $0 <dossier-source> [destination]}"DEST="${2:-$HOME/sauvegardes}"CONSERVER_JOURS=7
[[ -d "$SOURCE" ]] || { echo "Dossier introuvable : $SOURCE" >&2; exit 1; }mkdir -p "$DEST"
nom="$(basename "$SOURCE")"archive="$DEST/${nom}-$(date +%F_%H%M).tar.gz"
tar czf "$archive" -C "$(dirname "$SOURCE")" "$nom"echo "Archive créée : $archive"
# Rotation : supprime les archives plus anciennes que N joursfind "$DEST" -maxdepth 1 -name "${nom}-*.tar.gz" -mtime +"$CONSERVER_JOURS" -deleteUtilisation : ./sauvegarde.sh /srv/site /mnt/sauvegardes. Planification avec cron : voir Bonnes pratiques.
2. Alerte d’espace disque
Section intitulée « 2. Alerte d’espace disque »Affiche une alerte pour chaque système de fichiers rempli au-delà d’un seuil, et renvoie un code d’erreur exploitable par une supervision.
#!/usr/bin/env bashset -euo pipefail
SEUIL="${1:-80}" # pourcentage d'utilisationalerte=0
while read -r utilisation point; do pct="${utilisation%\%}" # retire le signe % if (( pct >= SEUIL )); then echo "ALERTE : $point utilisé à ${pct}% (seuil ${SEUIL}%)" >&2 alerte=1 fidone < <(df --output=pcent,target -x tmpfs -x devtmpfs | tail -n +2)
exit "$alerte"3. Surveiller un service et le relancer
Section intitulée « 3. Surveiller un service et le relancer »#!/usr/bin/env bashset -euo pipefail
SERVICE="${1:?Usage: $0 <service>}"
if systemctl is-active --quiet "$SERVICE"; then echo "$(date '+%F %T') $SERVICE actif"else echo "$(date '+%F %T') $SERVICE arrêté, redémarrage" >&2 systemctl restart "$SERVICE"fiÀ lancer en tant que root (par exemple depuis sudo crontab -e) : */5 * * * * /usr/local/bin/surveiller-service.sh nginx >> /var/log/surveillance.log 2>&1.
4. Script avec options
Section intitulée « 4. Script avec options »Liste les plus gros fichiers d’un dossier, avec des options -n et -v.
#!/usr/bin/env bashset -euo pipefail
usage() { cat <<EOFUsage : $0 [-v] [-n nombre] dossier -v mode verbeux -n nombre nombre de fichiers à afficher (défaut : 5) -h aideEOF}
verbeux=0nombre=5
while getopts ":vn:h" opt; do case "$opt" in v) verbeux=1 ;; n) nombre="$OPTARG" ;; h) usage; exit 0 ;; :) echo "Option -$OPTARG : argument manquant" >&2; usage >&2; exit 1 ;; \?) echo "Option inconnue : -$OPTARG" >&2; usage >&2; exit 1 ;; esacdoneshift $(( OPTIND - 1 ))
dossier="${1:-}"[[ -n "$dossier" ]] || { usage >&2; exit 1; }[[ -d "$dossier" ]] || { echo "Dossier introuvable : $dossier" >&2; exit 1; }
(( verbeux )) && echo "Analyse de $dossier"
find "$dossier" -type f -printf '%s %p\n' | sort -rn | awk -v n="$nombre" 'NR <= n' |while read -r taille chemin; do echo "$(numfmt --to=iec "$taille") $chemin"done5. Renommer des fichiers en lot
Section intitulée « 5. Renommer des fichiers en lot »Remplace les espaces par des tirets bas dans les noms de fichiers du dossier courant.
#!/usr/bin/env bashset -euo pipefail
for fichier in *\ *; do [[ -e "$fichier" ]] || continue # aucun fichier avec espace nouveau="${fichier// /_}" if [[ -e "$nouveau" ]]; then echo "Ignoré (existe déjà) : $nouveau" >&2 continue fi mv -- "$fichier" "$nouveau" echo "$fichier -> $nouveau"doneLe -- indique à mv que ce qui suit est un nom de fichier, même s’il commence par un tiret.
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Pour aller plus loin
Section intitulée « Pour aller plus loin »- Vérifier chaque script avec ShellCheck avant de le mettre en service