Mon premier script Bash
Notions théoriques
Vous savez déjà lancer des commandes Linux une par une dans un terminal (cd, ls, cp, chmod...). Un script Bash permet d'enchaîner plusieurs de ces commandes dans un seul fichier, pour les exécuter automatiquement, dans l'ordre, sans les retaper à la main.
En administration système, l'automatisation est essentielle : elle évite les erreurs de saisie, fait gagner du temps sur les tâches répétitives (sauvegardes, installations, vérifications...) et permet de documenter une procédure de façon exécutable.
Bash (Bourne Again SHell) est à la fois :
- l'interpréteur de commandes que vous utilisez déjà dans votre terminal,
- et un véritable langage de script, avec ses variables, ses conditions et ses boucles.
Le shebang
La toute première ligne d'un script Bash doit être :
#!/bin/bash
Cette ligne s'appelle le shebang. Elle indique au système quel interpréteur utiliser pour exécuter le fichier. Elle doit obligatoirement :
- être la première ligne du fichier,
- commencer en première colonne (aucun espace avant),
- ne contenir aucun espace entre
#!et/bin/bash.
Vous croiserez parfois #!/usr/bin/env bash à la place de #!/bin/bash. Cette variante recherche l'exécutable bash dans le $PATH plutôt que d'utiliser un chemin fixe, ce qui la rend un peu plus portable. Pour nos séances, #!/bin/bash suffit.
Les commentaires
Toute ligne commençant par # (sauf la toute première, le shebang) est un commentaire, ignoré par Bash. Il est recommandé de commencer chaque script par un petit en-tête expliquant son rôle :
#!/bin/bash
# Script : infos.sh
# Rôle : afficher quelques informations sur le serveur
# Auteur : Votre nom
Rendre un script exécutable
Un fichier de script est un fichier texte comme un autre : par défaut, il n'a pas le droit d'être exécuté. Il faut lui ajouter le droit d'exécution avec la commande chmod (déjà vue dans le cours Gestion des permissions) :
chmod +x infos.sh
Exécuter un script
Une fois le droit d'exécution accordé, il existe plusieurs façons de lancer un script :
./infos.sh # en indiquant le chemin (ici, le répertoire courant)
bash infos.sh # en demandant explicitement à bash de l'interpréter
/home/etu/infos.sh # avec un chemin absolu
Écrire simplement infos.sh (sans ./ devant) ne fonctionne pas, même si le script est exécutable et que vous êtes dans le bon dossier. Le message d'erreur est infos.sh: command not found.
En effet, pour des raisons de sécurité, le répertoire courant ne fait pas partie du $PATH (la liste des dossiers où Linux cherche les commandes). Il faut donc préciser explicitement ./ pour dire « le fichier qui est ici, dans ce dossier ».
Erreurs fréquentes
| Message | Cause probable |
|---|---|
Permission denied | Le script n'a pas le droit d'exécution → chmod +x |
command not found | Oubli du ./ devant le nom du script |
bad interpreter: ... : No such file or directory (souvent avec ^M) | Le fichier a été édité sous Windows et contient des retours à la ligne incompatibles |
Si vous éditez vos scripts avec un éditeur Windows, vérifiez que l'encodage des fins de ligne est bien au format Unix (LF), sinon le shebang lui-même peut devenir illisible pour Linux.
Enfin, il est courant de ranger ses scripts dans un dossier dédié, par exemple ~/scripts, pour les retrouver facilement.
Exemple pratique
#!/bin/bash
# Script : infos.sh
# Rôle : afficher un petit rapport système
# Auteur : Votre nom
echo "=== Rapport système ==="
echo "Date actuelle : $(date)"
echo "Nom de machine : $(hostname)"
echo "Utilisateur : $(whoami)"
echo "Temps de service : $(uptime -p)"
echo "=== Fin du rapport ==="
Pour l'utiliser :
nano infos.sh # on écrit le script
chmod +x infos.sh # on le rend exécutable
./infos.sh # on le lance
$(commande) permet d'insérer le résultat d'une commande directement dans un echo. Nous détaillerons cette syntaxe dans la prochaine séance, consacrée aux variables.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Nous allons créer le premier script de notre boîte à outils d'administration : infos.sh. Ce script sera repris et enrichi au fil des prochaines séances.