aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Outils & DevOps

Écrire un script Bash : démarrer l'automatisation

Un script Bash est le moyen le plus pratique de regrouper dans un seul fichier les commandes que vous tapez une à une dans le terminal, puis de les exécuter d'un coup. Effectuer à la main des tâches répétitives — nettoyer des logs sur un serveur, faire des sauvegardes, déployer un projet ou renommer des dizaines de fichiers — est à la fois fastidieux et source d'erreurs. Dans cet article, vous apprendrez à écrire des automatisations modestes mais vraiment utiles à l'aide des briques de base : variables, conditions et boucles.

Votre premier script : le shebang et le droit d'exécution

Tout commence par un fichier. Créez un bonjour.sh et placez un shebang sur la première ligne. Cette ligne indique au système quel interpréteur doit exécuter le fichier :

#!/usr/bin/env bash
echo "Bonjour, l'automatisation !"

Vous devez ensuite rendre le fichier exécutable, lui accorder la permission et appeler le script :

chmod +x bonjour.sh
./bonjour.sh

Utiliser #!/usr/bin/env bash trouve le bon interpréteur sans coder en dur l'emplacement où bash est installé. N'oubliez pas cette première ligne ; sinon le script dépend du shell qui l'invoque.

Variables et saisie utilisateur

Lorsque vous définissez une variable, il ne doit y avoir aucun espace autour du signe égal. Pour lire la valeur, vous la préfixez par $ et l'entourez presque toujours de guillemets doubles :

#!/usr/bin/env bash
nom="Aslain"
echo "Bienvenue, $nom"

# Lire une saisie de l'utilisateur
read -r -p "Quel est ton nom ? " reponse
echo "Salut $reponse"

Les guillemets doubles ont leur importance : écrire "$fichier" empêche les noms de fichiers contenant des espaces d'être découpés. Les omettre ($fichier) est une source classique de bugs. Pour capturer la sortie d'une commande dans une variable, utilisez $(...) :

aujourdhui="$(date +%Y-%m-%d)"
echo "Date du jour : $aujourdhui"

Conditions : if, test et comparaisons

L'automatisation reste incomplète sans la logique « dans ce cas, fais ceci ». En bash, vous construisez les conditions avec if et des crochets. Pour les comparaisons numériques on utilise -eq, -gt, -lt ; pour les chaînes, = et != :

#!/usr/bin/env bash
read -r -p "Entre un nombre : " n

if [ "$n" -gt 10 ]; then
  echo "$n est supérieur à dix"
elif [ "$n" -eq 10 ]; then
  echo "Exactement dix"
else
  echo "$n est inférieur à dix"
fi

Les tests de fichiers et de répertoires sont l'épine dorsale des scripts quotidiens : -f vérifie si un fichier existe, -d si un répertoire existe, et -z si une variable est vide :

if [ -d "/var/backups" ]; then
  echo "Le répertoire de sauvegarde est prêt"
else
  mkdir -p /var/backups
fi

Boucles : traiter de nombreux fichiers

C'est avec les boucles que bash fait gagner le plus de temps. Pour parcourir les fichiers d'un dossier, vous utilisez for :

#!/usr/bin/env bash
for fichier in *.log; do
  echo "Traitement : $fichier"
  gzip "$fichier"
done

Vous pouvez aussi lui donner une plage numérique pour répéter un nombre fixe de fois. Quand vous voulez boucler jusqu'à ce qu'une condition soit remplie, choisissez while :

# De 1 à 5
for i in {1..5}; do
  echo "Tentative $i"
done

# Lire un fichier ligne par ligne
while IFS= read -r ligne; do
  echo "Ligne : $ligne"
done < liste.txt

Le motif IFS= read -r est la façon sûre de lire des lignes : il préserve les espaces en début et fin de ligne et ne dénature pas les barres obliques inverses.

Fonctions et arguments

À mesure qu'un script grandit, transformer les parties répétées en fonctions améliore la lisibilité. Vous accédez aux arguments passés au script avec $1, $2, et à tous d'un coup avec $@ :

#!/usr/bin/env bash
log() {
  echo "[$(date +%H:%M:%S)] $1"
}

sauvegarder() {
  local source="$1"
  local cible="$2"
  cp -r "$source" "$cible" && log "Sauvegardé : $cible"
}

sauvegarder "$1" "/var/backups"

Utiliser local dans une fonction confine les variables à cette fonction, ce qui évite d'écraser par accident le reste du script.

Des scripts robustes : la gestion des erreurs

Les scripts professionnels ne produisent pas silencieusement de mauvais résultats. Ajouter cette ligne en haut du fichier devrait devenir un réflexe :

set -euo pipefail

Ces trois réglages fonctionnent ensemble : -e arrête le script dès qu'une commande échoue, -u traite l'usage d'une variable non définie comme une erreur, et pipefail détecte l'échec de n'importe quelle commande d'un pipeline. Passer votre script dans un outil d'analyse statique comme ShellCheck avant de le livrer repère aussi tôt les erreurs de guillemets et de variables.

Questions fréquentes

Quelle est la différence entre bash et sh ?

sh désigne le shell POSIX, plus ancien et plus limité ; bash est un sur-ensemble qui offre les tableaux, les tests [[ ]] et une syntaxe plus riche. Si votre script commence par #!/usr/bin/env bash, vous pouvez utiliser les fonctionnalités de bash en toute confiance.

Comment déboguer mon script ?

La méthode la plus rapide est de l'exécuter avec bash -x script.sh, qui affiche chaque commande avant son exécution. Vous pouvez aussi placer set -x dans le script et le désactiver avec set +x pour ne tracer que la partie suspecte.

Bash suffit-il pour de grandes automatisations ?

Bash est excellent pour les opérations sur fichiers et l'enchaînement de commandes. Mais dès qu'il faut des structures de données complexes, du traitement JSON ou une logique lourde, passer à un langage comme Python est plus maintenable. Une bonne règle : au-delà de 100 lignes avec beaucoup de branchements, envisagez de changer de langage.

Si vous voulez automatiser des tâches répétitives mais ne savez pas par où commencer, des scripts serveur aux pipelines de déploiement, contactez-moi pour une mise en place concrète.

Bu kategorideki tüm yazılar →

Devamı için