Mini-projet : premier script shell
Créer un premier script shell affichant l’état du système.
Objectifs
À la fin de cette étape, vous saurez :
- écrire un fichier de commandes exécutables ;
- utiliser
#!/bin/bashetchmod +x; - combiner shell, codes de retour et variables d'environnement ;
- rédiger un « rapport d'état » du système.
🔗 Pour vous rafraîchir la mémoire : le terminal et le prompt · manipulation de fichiers (cp, mv, rm)
Qu'est-ce qu'un script shell ?
Un script shell est un fichier contenant des lignes de commandes. Lorsqu'on l'exécute, le shell lit le fichier ligne par ligne et exécute chaque instruction. C'est l'automatisation : ce que vous tapez devient un objet réutilisable.
Structure de base
#!/bin/bash
echo "Bonjour, je suis $(whoami)."
echo "Répertoire courant : $(pwd)"
La toute première ligne, le shebang (#!), dit au système quel programme doit lire la suite. Sans elle, le comportement dépend de la manière de lancer le fichier ; avec elle, l'exécution est identique partout.
Donner le droit d'exécuter
chmod +x mon-script.sh
chmod change les permissions. +x ajoute le droit d'exécution pour le propriétaire. Sans lui, le système refuse d'exécuter : permission denied.
Le fichier de vérification : code de retour
La suite du script est un rapport d'état :
#!/bin/bash
echo "=== État du système ==="
echo "Utilisateur : $(whoami)"
echo "Répertoire : $(pwd)"
echo "Machine : $(hostname)"
touch /tmp/rapport.txt && echo "Fichier créé : /tmp/rapport.txt"
ls /tmp/rapport.txt
if [ $? -eq 0 ]; then
echo "Vérification : fichier bien présent."
fi
La structure if [ ... ] teste une condition : $? -eq 0 compare le code de retour à 0. -eq est le comparateur numérique du test [ ... ], et les espaces autour des crochets sont obligatoires. Le bloc then ... fi s'exécute quand le test réussit.
Lancer le script
./mon-script.sh
Ou sans droit d'exécuter :
bash ./mon-script.sh
La seconde méthode fait uniquement appel à l'interpréteur, sans modifier les droits du fichier.
Exercice
- Créez un script
etat.shdans votre répertoire de travail. - Rédigez-lui le comportement suivant :
- afficher le nom de l'utilisateur ;
- afficher le répertoire courant ;
- créer un fichier dans
/tmp; - vérifier le code de retour de la création et afficher « création ok » ou « échec de la création ».
- Rendez-le exécutable, lancez-le, puis relancez-le en l'invoquant avec
bash. - Variante : ajoutez un paramètre. Dans le script, utiliser
$1(le premier paramètre) pour indiquer le nom du fichier à créer, avec une valeur par défaut si$1est vide :
#!/bin/bash
NOM_FICHIER="${1:-rapport.txt}"
Contraintes
- Le script doit se terminer avec le code 0.
- Sorties lisibles : une ligne par information, avec « : » entre le libellé et la valeur.
- Aucune écriture ailleurs que dans
/tmpou votre répertoire personnel.
Indices
Chez $? : après chaque commande, le code de retour est réécrit. La vérification doit suivre immédiatement la commande visée.
Chez $(...) : c'est une substitution de commande : la sortie de la commande interne devient une valeur utilisable. $(pwd) donne le chemin courant.
Chez le test : [ $? -eq 0 ] est lui-même un test : il réussit si le code vaut 0, échoue sinon. Les espaces autour des crochets sont obligatoires.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Solution complète
#!/bin/bash
echo "=== Rapport d'état ==="
echo "Utilisateur : $(whoami)"
echo "Répertoire : $(pwd)"
echo "Fichier à créer : ${1:-etat.txt}"
touch "/tmp/${1:-etat.txt}"
echo "Création exécutée"
ls -la "/tmp/${1:-etat.txt}"
if [ $? -eq 0 ]; then
echo "Vérification : création ok"
else
echo "Échec de la création"
fi
Lancement
chmod +x etat.sh
./etat.sh
./etat.sh rapport-systeme.txt
Explication
#!/bin/bashest lu par le noyau à l'exécution.${1:-etat.txt}utilise le premier paramètre, sinon la valeur de repli.- Le
lsfinal sert de dernier point de contrôle : le code de retour testé juste après est bien celui de cette vérification. [ $? -eq 0 ]teste l'égalité numérique : le code n'est pas affiché, seule la branche correspondante duifs'exécute.
Le résultat est un script exécutable qui prend une entrée, agit, et confirme le succès par son propre code de retour : le modèle des commandes.