Démarrer avec les scripts Bash sous Linux : guide pratique pour créer votre tout premier script

Le Bash représente bien plus qu’un simple outil pour les administrateurs système : c’est la clé permettant d’automatiser des centaines de tâches répétitives sous Linux. Cet interpréteur de commandes figure par défaut sur pratiquement toutes les distributions, des plus populaires comme Ubuntu et Debian aux environnements serveur professionnels, ce qui en fait une compétence essentielle pour quiconque souhaite maîtriser cet écosystème.

Miniature vidéo YouTube


Comprendre le Bash et son rôle fondamental dans l’écosystème Linux

Bash est un interpréteur de commandes permettant d’exécuter des instructions et d’automatiser des tâches sous Linux, offrant un contrôle précis sur les processus, fichiers et ressources système grâce à une interaction directe avec le noyau de l’OS.

Le Bash, acronyme de « Bourne Again Shell », incarne bien plus qu’une simple interface de communication avec le système d’exploitation. Il s’agit d’un interpréteur de commandes sophistiqué qui positionne l’utilisateur au cœur des mécanismes de gestion de la machine, offrant un contrôle granulaire sur les processus, les fichiers et les ressources système.

Contrairement aux interfaces graphiques qui simplifient l’accès aux fonctionnalités, le shell Bash autorise une interaction directe et précise avec le noyau Linux. Chaque commande lancée représente une instruction explicite, transparente et documentable, permettant ainsi une meilleure traçabilité des opérations. Cette transparence devient cruciale dans les environnements professionnels où l’audit et la reproductibilité constituent des enjeux majeurs.

L’apprentissage du Bash dépasse la simple accumulation de syntaxes : il incarne une philosophie d’automatisation enracinée dans la culture Unix depuis les années 1970. Les administrateurs système expérimentés reconnaissent que maîtriser cet outil signifie transformer des tâches manuelles fastidieuses en processus fluides, reproductibles et optimisés. Un gestionnaire de parc informatique réduisant manuellement les permissions sur cinquante serveurs chaque semaine comprendra immédiatement l’intérêt de déléguer cette tâche à un script Bash exécuté en quelques secondes.

Pourquoi les scripts Bash sont-ils indispensables en 2026 ?

L’expansion des infrastructures cloud, l’adoption massive du DevOps et la containerisation via Docker intensifient la demande en professionnels sachant manipuler le Bash. Les environnements modernes, construits autour d’orchestrateurs comme Kubernetes, reposent fondamentalement sur des scripts d’automatisation écrits en Bash.

La raison est simple : le Bash fournit une abstraction stable et universelle pour les systèmes de type Unix. Qu’il s’agisse de provisionner une machine virtuelle, de gérer les fichiers de configuration, de monitorer les performances système ou de orchestrer des déploiements, les professionnels retrouvent des constructs Bash identiques d’un environnement à l’autre. Cette cohérence garantit que les compétences acquises aujourd’hui resteront pertinentes dans cinq, dix ou quinze ans.

🌟 Bon à savoir

Le Bash est le shell le plus utilisé sous Linux, mais il en existe d’autres comme Zsh ou Fish, qui proposent des fonctionnalités supplémentaires pour les utilisateurs avancés.

Les fondamentaux : maîtriser les commandes essentielles de Linux

Les commandes essentielles de Linux incluent pwd pour afficher le répertoire courant, ls pour lister les fichiers, cd pour changer de répertoire, mkdir pour créer des dossiers, touch pour créer des fichiers, rm pour supprimer, et chmod pour gérer les permissions.

Avant de rédiger un script sophistiqué, il convient de consolider les bases en explorant les commandes couramment utilisées. Chaque commande suit une syntaxe prévisible combinant un nom, des options et des arguments, permettant une organisation logique et méthodique des opérations système.

Naviguer et structurer le système de fichiers

La navigation dans le système de fichiers constitue la fondation de toute interaction avec Linux. La commande pwd (Print Working Directory) affiche le répertoire courant, tandis que cd (change directory) facilite le déplacement entre répertoires. Ces deux commandes élémentaires permettent à l’utilisateur de se repérer et de progresser dans l’arborescence du système.

Pour explorer le contenu d’un répertoire, la commande ls offre une flexibilité remarquable. Son option -l affiche les détails complets : permissions, propriétaire, groupe, taille et date de modification. L’option -a révèle les fichiers cachés (commençant par un point), tandis que -R explore récursivement les sous-répertoires. Comprendre ces nuances transforme l’exploration du système de fichiers en une tâche précise et efficace.

Pour créer des répertoires, la commande mkdir (make directory) s’appuie sur des chemins explicites. Par exemple, mkdir -p /home/user/projets/python crée l’arborescence complète en une seule invocation, le flag -p assurant la création des répertoires parents manquants. Cette fonctionnalité s’avère précieuse pour structurer rapidement des espaces de travail complexes.

Créer, modifier et supprimer des fichiers avec précision

La commande touch sert traditionnellement à modifier les horodatages des fichiers, mais elle excelle aussi à la création rapide de fichiers vides. Un administrateur souhaitant préparer un template de configuration exécutera simplement touch /etc/config.conf avant de le remplir avec un éditeur.

Pour manipuler le contenu des fichiers, plusieurs approches coexistent. La commande cat affiche l’intégralité d’un fichier en une seule opération, tandis que less ou more proposent une navigation paginée, utile pour les fichiers volumineux. L’éditeur nano offre une interface minimaliste et intuitive, idéal pour les scripts simples, alors que vim fournit des capacités avancées justifiant son apprentissage progressif.

La suppression de fichiers requiert la plus grande vigilance. La commande rm ne demande pas de confirmation par défaut et ne place aucun fichier dans une corbeille : les données disparaissent immédiatement. L’option -i (interactive) force la demande de confirmation avant chaque suppression, transformant un geste dangereux en opération sécurisée. Pour les répertoires, le flag -r active la suppression récursive, appliquant la commande à tous les fichiers et sous-répertoires.

Comprendre les permissions et contrôler l’accès

Chaque fichier et répertoire sous Linux dispose d’un système de permissions trichotomique : lecture (r), écriture (w) et exécution (x). Ces permissions s’appliquent à trois catégories distinctes : propriétaire (u pour user), groupe (g) et autres (o pour others). La commande chmod (change mode) modifie ces permissions en utilisant une notation numérique ou symbolique.

Exemple concret : chmod 755 script.sh octroie au propriétaire les permissions complètes (7 = rwx), tandis que groupe et autres n’obtiennent que la lecture et l’exécution (5 = r-x). Alternativement, chmod u+x script.sh ajoute simplement la permission d’exécution pour le propriétaire, sans modifier les autres permissions. Cette granularité s’avère indispensable pour respecter les principes de sécurité et de moindre privilège.

🔧 Commande📝 Description📋 Exemple d’usage
pwdAffiche le répertoire de travail courantpwd
ls -lListe les fichiers avec détails completsls -l /home/user/documents
cdChange le répertoire de travailcd /var/log
mkdir -pCrée un répertoire avec arborescence parentmkdir -p ~/projets/web/frontend
touchCrée un fichier vide ou met à jour l’horodatagetouch config.ini
rm -rSupprime fichiers et répertoires récursivementrm -r ~/documents/old_project
chmod 755Modifie les permissions d’accèschmod 755 deploy.sh
🛠️ Astuce

Ajoutez des commentaires dans vos scripts Bash pour faciliter leur compréhension et leur maintenance. Un script bien documenté sera bien plus facile à reprendre ou à corriger plusieurs mois plus tard.

Miniature vidéo YouTube


Créer et configurer votre premier script Bash : démarrage pratique

Un script Bash débute par la ligne shebang #!/bin/bash, qui indique l’interpréteur à utiliser ; il est recommandé d’ajouter des commentaires descriptifs pour faciliter la maintenance et la compréhension du script.

Franchir le cap de la création du premier script constitue une transition majeure. Passer de l’exécution isolée de commandes à la rédaction d’une suite logique d’instructions demande une organisation mentale différente et une compréhension de concepts tels que les variables, les conditions et les boucles.

Initialiser un script avec le shebang et les bonnes pratiques

Tout script Bash débute obligatoirement par une ligne spéciale appelée shebang : #!/bin/bash. Cette ligne n’est pas un commentaire, bien qu’elle débute par un dièse : elle indique au système d’exploitation quel interpréteur utiliser pour exécuter le fichier. Sans cette ligne, le système ne saurait pas comment traiter le contenu du script.

Le shebang reflète la philosophie Unix selon laquelle chaque fichier exécutable doit déclarer explicitement son interpréteur. Un script Python commence par #!/usr/bin/python3, tandis qu’un script shell Bash débute par #!/bin/bash. Cette flexibilité permet au même système d’exploitation de traiter des fichiers textes comme des programmes exécutables, une innovation majeure du design Unix.

Après le shebang, les bonnes pratiques recommandent d’ajouter un commentaire descriptif expliquant l’objectif du script. Exemple :

#!/bin/bash
# Sauvegarde automatique des fichiers de configuration
# Date de création : 2026
# Auteur : Administrateur système

Ces commentaires facilitent la maintenance future. Un script revisité six mois plus tard bénéficiera énormément d’une documentation initiale claire, évitant l’archétype du « code legacy » incompréhensible.

Utiliser les variables pour stocker et manipuler les données

Les variables représentent des conteneurs nommés stockant des valeurs qui peuvent être modifiées ou réutilisées tout au long du script. La syntaxe de déclaration suit le modèle NOMVARIABLE=valeur, où l’absence d’espaces autour du signe égal constitue une exigence inflexible en Bash.

Considérez ce scénario pratique : un administrateur doit sauvegardé le répertoire /var/www/html sur plusieurs serveurs. Au lieu de coder le chemin en dur à quinze reprises, il déclare une variable en début de script :

REPWEBSITE=/var/www/html
tar -czf backup_${REPWEBSITE##*/}.tar.gz « $REPWEBSITE »

Cette approche offre plusieurs avantages. D’abord, la maintenance devient triviale : modifier la source implique une seule édition. Ensuite, la lisibilité augmente dramatiquement. Enfin, les erreurs de typage disparaissent puisqu’une variable assure la cohérence des valeurs utilisées.

Les variables de Bash acceptent aussi des valeurs issues de commandes, grâce à la substitution de commande. La syntaxe VARIABLE=$(commande) exécute la commande et stocke sa sortie dans la variable :

DATEETAT=$(date +%Y-%m-%d)
NOMBRELIGNES=$(wc -l < fichier.txt)
IPLOCALE=$(hostname -I)

Implémenter des conditions pour contrôler le flux d’exécution

Les structures conditionnelles if-else permettent aux scripts de prendre des décisions basées sur le résultat de tests. La syntaxe fondamentale s’articule autour de trois mots-clés : if introduit le test, then marque le début du bloc exécuté si la condition est vraie, et fi termine la structure.

if [ condition ]
then
# Instructions si vraie
else
# Instructions si fausse
fi

Les tests courants incluent la comparaison numérique (-eq pour égal, -ne pour différent, -lt pour inférieur, -gt pour supérieur) et la comparaison de chaînes (= pour égal, != pour différent). Les tests fichiers permettent de vérifier l’existence ou les propriétés : -f teste si c’est un fichier régulier, -d teste si c’est un répertoire, -x vérifie la permission d’exécution.

Exemple pratique : vérifier si un fichier de configuration existe avant de le charger :

CONFIG= »/etc/app/config.conf »
if [ -f « $CONFIG » ]
then
source « $CONFIG »
echo « Configuration chargée avec succès »
else
echo « Erreur : fichier $CONFIG introuvable »
exit 1
fi

🛠️ Astuce

Pour exécuter un script Bash même sans permission d’exécution, lancez-le directement avec bash nomduscript.sh.

 Apprendre à créer son premier script Bash sous Linux grâce à ce guide pratique, c’est découvrir comment automatiser des opérations, manipuler le shell, structurer ses scripts avec des variables et des conditions, et exploiter toute la puissance de l’environnement Linux pour gérer ses serveurs. Apprendre à créer son premier script Bash sous Linux grâce à ce guide pratique, c’est découvrir comment automatiser des opérations, manipuler le shell, structurer ses scripts avec des variables et des conditions, et exploiter toute la puissance de l’environnement Linux pour gérer ses serveurs

Passer à la pratique : exemples concrets et cas d’usage réels

Les scripts Bash s’exécutent en leur attribuant la permission d’exécution via chmod +x, puis en les lançant avec ./nom_du_script.sh ou en utilisant bash nom_du_script.sh, avec possibilité de passer des arguments en ligne de commande.

La théorie se consolide uniquement par la pratique. Examiner et écrire des scripts répondant à des besoins tangibles permettra d’intérioriser les concepts et de développer l’intuition nécessaire pour créer de nouveaux scripts autonomement.

Exemple 1 : Automatiser la vérification de la disponibilité d’un serveur

Considérez un responsable d’infrastructure devant vérifier quotidiennement si une machine critique reste accessible. Au lieu d’effectuer un ping manuel, il rédige un script se chargeant automatiquement de cette tâche. Voici une implémentation progressive :

#!/bin/bash
# Vérifie la disponibilité d’une adresse IP donnée en argument
SERVEUR=$1
PINGS=2
ping -c $PINGS « $SERVEUR » > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo « ✅ Le serveur $SERVEUR répond au ping »
else
echo « ❌ Le serveur $SERVEUR est inaccessible »
fi

Ce script introduit plusieurs éléments clés. La variable $1 capte le premier argument passé en ligne de commande, permettant d’utiliser le script de manière générique : ./check_server.sh 192.168.1.100. La redirection /dev/null 2>&1 supprime toute sortie, gardant seulement le code de retour. La variable $? contient ce code de retour : 0 indique succès, toute autre valeur signifie erreur.

Exemple 2 : Créer une sauvegarde automatisée avec horodatage

Les sauvegardes manuelles esquissent un risque majeur : l’oubli humain. Un script assurant une sauvegarde quotidienne automatique offre une tranquillité bien supérieure.

#!/bin/bash
# Sauvegarde du répertoire de l’application avec compression
SOURCE= »/opt/myapp/data »
DEST= »/backups »
DATEFORMAT=$(date +%Y%m%d_%H%M%S)
ARCHIVE= »backup_${DATEFORMAT}.tar.gz »
if [ -d « $SOURCE » ]
then
tar -czf « $DEST/$ARCHIVE » « $SOURCE »
echo « 💾 Sauvegarde créée : $ARCHIVE »
else
echo « ❌ Erreur : répertoire source introuvable »
exit 1
fi

Ce script introduit la substitution de commande pour capturer la date actuelle. L’utilisation de guillemets doubles protège les variables contenant des espaces. La structure conditionnelle valide l’existence du répertoire avant la sauvegarde, évitant les erreurs silencieuses.

Comment exécuter vos scripts et gérer les permissions

Un script rédigé reste inerte sans les permissions appropriées. Les fichiers nouvellement créés ne disposent généralement pas de permission d’exécution. Pour l’activer, la commande chmod +x script.sh ajoute cette permission pour le propriétaire, le groupe et les autres. Pour être plus restrictif, chmod u+x script.sh ajoute l’exécution uniquement au propriétaire.

L’exécution d’un script peut emprunter deux chemins distincts. Le premier, ./script.sh, exécute le fichier directement si les permissions le permettent, en utilisant le shebang pour identifier l’interpréteur. Le second, bash script.sh, invoke explicitement Bash indépendamment des permissions du fichier, utilement pour tester rapidement.

Passer un argument au script s’effectue simplement en l’ajoutant après le nom : ./check_server.sh 8.8.8.8 passera « 8.8.8.8 » à la variable $1 du script. Les arguments multiples distribuent les valeurs : $2, $3, etc.

🛠️ Astuce

Utilisez la boucle for pour automatiser des opérations répétitives, comme le déploiement simultané de commandes sur plusieurs serveurs.

Progresser vers des scripts plus sophistiqués avec boucles et fonctions

Les boucles permettent d’itérer sur des listes ou des conditions, tandis que les fonctions encapsulent des suites d’instructions réutilisables, améliorant la structure, la modularité et la maintenance des scripts Bash.

Une fois les bases maîtrisées, explorer les boucles et les fonctions ouvre des horizons de complexité utile. Ces constructs permettent d’écrire des scripts réutilisables et maintenables, réduisant la duplication de code et améliorant la clarté logique.

Les boucles : itérer efficacement sur des données

La boucle for répète des instructions un nombre déterminé de fois ou sur chaque élément d’une liste. Deux syntaxes principales coexistent :

for variable in liste
do
# Instructions
done

Ou la forme C-style pour les itérations numérotées :

for ((i=1; i<=10; i++))
do
echo « Itération $i »
done

Considérez un administrateur devant appliquer une mise à jour à cinquante serveurs. Au lieu de copier manuellement un script sur chacun, il compose une boucle :

#!/bin/bash
SERVEURS=(« srv1.local » « srv2.local » « srv3.local »)
for serveur in « ${SERVEURS[@]} »
do
echo « Mise à jour de $serveur… »
ssh « $serveur » « sudo apt update && sudo apt upgrade -y »
done

La boucle while exécute des instructions tant qu’une condition reste vraie, utile pour les traitements conditionnels ou la lecture de fichiers ligne par ligne :

while read ligne
do
echo « Ligne lue : $ligne »
done < fichier.txt

Les fonctions : modulariser et réutiliser le code

Les fonctions encapsulent une suite d’instructions dans une unité nommée, réutilisable plusieurs fois dans le script ou même importée par d’autres scripts. La syntaxe s’articule simplement :

nom_fonction() {
# Corps de la fonction
local variable= »valeur »
return 0
}

Le mot-clé local restreint la portée d’une variable à la fonction, évitant les effets de bord imprévisibles. L’instruction return sort de la fonction en spécifiant un code de sortie utilisable via $?.

Exemple pratique : une fonction de validation d’adresse IP :

valider_ip() {
local ip=$1
if [[ $ip =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]
then
return 0
else
return 1
fi
}
if valider_ip « 192.168.1.1 »
then
echo « ✅ Adresse IP valide »
fi

  • 🔄 Boucles for : idéales pour itérer sur des listes ou des plages numériques définies
  • 🔄 Boucles while : parfaites pour les traitements conditionnels et la lecture progressive de fichiers
  • 📦 Fonctions : encapsulent la logique réutilisable et facilitent la maintenance du code
  • ⚙️ Portée locale : utiliser « local » dans les fonctions évite les conflits de variables
  • ✔️ Codes de sortie : communiquer le succès ou l’erreur via « return » permet la composition de fonctions
🌟 Bon à savoir

La redirection 2>&1 permet de fusionner les sorties standard et erreur dans le même fichier, idéal pour le débogage ou la journalisation.

Maîtriser les concepts avancés : pipes, redirections et gestion des erreurs

Les pipes connectent la sortie d’une commande à l’entrée d’une autre, les redirections orientent les flux standards, et la gestion des erreurs via set -e ou les codes de sortie garantit la fiabilité et la robustesse des scripts Bash.

Au-delà des structures de base, les concepts avancés confèrent à Bash sa puissance véritable. Le pipeline, les redirections et la gestion méthodique des erreurs transforment les scripts d’amateurs en outils professionnels fiables.

Le pipeline : composer des commandes de manière élégante

Le pipeline, représenté par le caractère |, connecte la sortie d’une commande à l’entrée de la suivante. Cette composition chaîne les traitements de manière fluide et expressive :

cat fichier.log | grep « Erreur » | sort | uniq -c | sort -rn

Cette chaîne affiche le contenu d’un fichier log, filtre les lignes contenant « Erreur », les trie, compte les occurrences identiques et réordonne le résultat par nombre décroissant. L’ensemble s’accomplît avec une élégance remarquable, chaque commande accomplissant une tâche précise.

L’utilité du pipeline devient évidente avec un cas concret : analyser les accès HTTP pour identifier les adresses IP les plus actives :

cat /var/log/apache2/access.log | awk ‘{print $1}’ | sort | uniq -c | sort -rn | head -10

Cette commande extract chaque adresse IP (premier champ), compte les occurrences, trie en ordre décroissant et affiche le top 10. En mode graphique, cette opération nécessiterait l’ouverture d’outils supplémentaires et plusieurs clics ; en ligne de commande, quelques caractères suffisent.

Les redirections : capturer et réorienter les flux de données

Trois flux standards existent : stdin (entrée standard, clavier par défaut), stdout (sortie standard, écran par défaut) et stderr (erreur standard, également l’écran par défaut). Les redirections modifient ces destinations par défaut :

> redirige stdout vers un fichier, écrasant le contenu existant
>> ajoute à la fin d’un fichier sans écraser
2> redirige stderr vers un fichier
2>&1 redirige stderr vers la même destination que stdout

Exemple pratique : capturer tous les messages, erreurs incluses, dans un fichier journal :

./script.sh > resultats.log 2>&1

Cette ligne exécute le script, place sa sortie standard et ses erreurs dans resultats.log, permettant une inspection ultérieure. Pour ignorer toutes les sorties, rediriger vers /dev/null :

./script_silencieux.sh > /dev/null 2>&1

Gérer les erreurs avec élégance et robustesse

Un script professionnel ne se contente pas d’exécuter des instructions : il gère explicitement les situations d’erreur. L’absence de gestion d’erreur crée des scénarios où un script continue son exécution malgré l’échec d’une opération critique.

La technique set -e placée en début de script termine l’exécution dès qu’une commande retourne un code d’erreur non-nul. Cette approche radicale tue le script au premier problème, évitant les cascades d’erreurs :

#!/bin/bash
set -e
mkdir /tmp/test
cd /tmp/test
# Si mkdir échoue, le script s’arrête et ne tente pas le cd

Une approche plus nuancée vérifie manuellement chaque opération critique :

if ! tar -czf backup.tar.gz /important_data; then
echo « ❌ Erreur de sauvegarde » >&2
exit 1
fi

Ici, &2 redirige le message d’erreur vers stderr au lieu de stdout, une convention Unix permettant la distinction entre résultats normaux et anomalies.

⚡ Opérateur/Concept📌 Utilité🎯 Cas d’usage
| (Pipeline)Chaîne les sorties vers les entrées successivesFiltrer et transformer des données
> (Redirection)Envoie stdout dans un fichierSauvegarder les résultats
2>&1Redirige erreurs et sorties au même endroitJournaliser complètement un script
set -eArrête le script au premier échecPrévenir l’exécution cascadée d’erreurs
$?Contient le code de sortie précédentVérifier manuellement l’exécution
&>Redirige tous les flux vers un fichierCapture complète des opérations

Maitriser ces concepts avancés confère aux scripts une robustesse professionnelle. Un script capable de gérer gracieusement les situations d’erreur, de composer élégamment les commandes et de capturer les sorties de manière contrôlée se distingue radicalement d’une simple succession d’instructions.

Les compétences acquises à travers la création de scripts Bash représentent un investissement durable. Qu’il s’agisse d’automatiser des tâches quotidiennes, de déployer des applications ou d’administrer des infrastructures complexes, le Bash demeure l’outil fondamental sous Linux. Maîtriser cet interpréteur signifie acquérir une compétence intemporelle, un socle sur lequel les professionnels de l’informatique construisent leur expertise durant des décennies. La pratique régulière, l’expérimentation avec des cas réels et la consultation de la documentation système transformeront progressivement les utilisateurs novices en administrateurs confiants et efficaces.

Retour en haut