Aller au contenu

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.

Crée une archive datée et supprime celles de plus de 7 jours.

#!/usr/bin/env bash
set -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 jours
find "$DEST" -maxdepth 1 -name "${nom}-*.tar.gz" -mtime +"$CONSERVER_JOURS" -delete

Utilisation : ./sauvegarde.sh /srv/site /mnt/sauvegardes. Planification avec cron : voir Bonnes pratiques.

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 bash
set -euo pipefail
SEUIL="${1:-80}" # pourcentage d'utilisation
alerte=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
fi
done < <(df --output=pcent,target -x tmpfs -x devtmpfs | tail -n +2)
exit "$alerte"
#!/usr/bin/env bash
set -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.

Liste les plus gros fichiers d’un dossier, avec des options -n et -v.

#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<EOF
Usage : $0 [-v] [-n nombre] dossier
-v mode verbeux
-n nombre nombre de fichiers à afficher (défaut : 5)
-h aide
EOF
}
verbeux=0
nombre=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 ;;
esac
done
shift $(( 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"
done

Remplace les espaces par des tirets bas dans les noms de fichiers du dossier courant.

#!/usr/bin/env bash
set -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"
done

Le -- 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 »
  • Vérifier chaque script avec ShellCheck avant de le mettre en service