Introduction
Imaginez que vous avez un robot serveur. Un robot statique ne peut dire que « Bonjour, Monsieur » à tout le monde. Un robot dynamique peut vous demander votre nom et dire « Bonjour, Sarah » ou « Bonjour, Mike ».
Dans le lab précédent, votre script faisait toujours exactement la même chose. Dans ce lab, vous allez le rendre dynamique en permettant à des données de venir de l'extérieur du script.
Il s'agit d'un changement majeur en programmation. Dès qu'un script peut accepter une saisie, il cesse d'être une démonstration figée et devient un outil réutilisable.
Vous apprendrez deux façons de communiquer avec votre script :
- Demander et écouter : le script s'interrompt et vous pose une question (avec
read). - Transmettre des informations : vous transmettez une information au script dès son démarrage (avec des arguments).
À la fin de ce lab, votre code pourra saluer qui vous voulez, et pas seulement « World ».
Utiliser read pour une saisie interactive
Notre première méthode repose sur une approche « conversationnelle ». Nous allons faire afficher une question au script, puis le faire attendre une réponse.
Nous utiliserons la commande read. Imaginez que read signifie : « Arrête tout, tends l'oreille et attends que l'utilisateur saisisse quelque chose. »
C'est votre premier exemple de script qui reçoit des données alors qu'il est déjà en cours d'exécution. En scripting shell, une variable est un emplacement nommé qui stocke temporairement des données, par exemple un nom d'utilisateur, un nom de fichier ou un nombre. Les variables rendent les scripts réutilisables, car le script peut traiter des saisies variables au lieu de texte écrit en dur.
Commencez par vérifier que vous vous trouvez dans votre espace de travail :
cd ~/project
Créez un fichier nommé hello.sh avec nano :
nano hello.sh
Saisissez le code suivant.
Remarque : nous définissons une « boîte » (variable) appelée name pour stocker la réponse de l'utilisateur.
#!/bin/bash
echo "What is your name?"
read name
echo "Hello, $name!"
Décomposons ce code :
echo "...": le script vous parle.read name: le script vous écoute. Tout ce que vous saisissez est placé dans la boîtename.$name: le script ouvre la boîte. Le symbole$permet d'accéder à la variable et d'en lire le contenu.
Observez la différence entre name et $name. name est le nom de la variable lorsque vous la créez ou que vous lui attribuez une valeur. $name signifie « remplacez ceci par la valeur stockée dans la variable ». Ce remplacement s'appelle l'expansion et constitue l'un des comportements les plus importants du shell.
Enregistrez votre travail (Ctrl+O, Enter), puis quittez (Ctrl+X).
Exécuter le script interactif
Avant de pouvoir dialoguer avec notre script, nous devons l'autoriser à s'exécuter. Vous souvenez-vous de la « clé » du lab précédent ?
Accordez la permission d'exécution :
chmod +x hello.sh
Nous pouvons maintenant dialoguer avec le script. Exécutez-le :
./hello.sh
Le script affiche « What is your name? », puis il s'interrompt. Il attend votre réponse. Le curseur peut clignoter.
Saisissez votre nom (par exemple, Alice), puis appuyez sur Enter.
What is your name?
Alice
Hello, Alice!
On parle de saisie interactive. Cette méthode convient parfaitement aux outils utilisés par des personnes, mais elle est peu adaptée à l'automatisation. Imaginez que vous essayiez d'exécuter ce script automatiquement à 3 heures du matin : il resterait bloqué en attendant une réponse qui ne viendrait jamais !
Cette différence est importante dans les opérations réelles. Les scripts interactifs sont pratiques lorsqu'une personne est présente, tandis que les tâches planifiées, les pipelines CI et les scripts de démarrage ont généralement besoin d'une saisie non interactive pour s'exécuter sans intervention.
Utiliser des arguments pour une saisie non interactive
Pour rendre notre script compatible avec l'automatisation, nous devons pouvoir lui fournir les données avant son démarrage, afin qu'il n'ait jamais besoin de s'interrompre. Pour cela, nous utilisons des arguments.
Imaginez les arguments comme une « fente à courrier » dans une porte. Vous y glissez le message en passant.
Dans Bash, ces fentes à courrier portent des noms numérotés :
$1correspond au premier mot que vous saisissez après le nom du script.$2correspond au deuxième mot, et ainsi de suite.
Ces valeurs numérotées sont appelées paramètres positionnels. Le shell les crée automatiquement au démarrage du script. Vous ne définissez pas vous-même $1 : Bash le remplit à partir de la ligne de commande qui a lancé le script.
Modifions hello.sh afin qu'il consulte la première fente, $1, au lieu de poser une question.
Ouvrez le fichier :
nano hello.sh
Modifiez le code pour obtenir ceci :
#!/bin/bash
name=$1
echo "Hello, $name!"
Ici, name=$1 prend ce qui se trouve dans la fente $1 et le place dans la boîte name. Aucune attente, aucune question.
Enregistrez le fichier, puis quittez nano.
Exécuter le script avec des arguments
Vous allez maintenant exécuter le script d'une autre manière. Il vous suffit de transmettre le nom au script au moment de son lancement.
Exécutez cette commande :
./hello.sh LabEx
Ici, LabEx est l'argument. Le script le récupère dans $1, puis affiche immédiatement :
Hello, LabEx!
Essayez avec un autre nom :
./hello.sh World
Le script fonctionne instantanément, sans attendre.
Le problème de la fente vide
Que se passe-t-il si vous ne fournissez aucun argument ?
./hello.sh
Vous obtenez :
Hello, !
La fente $1 était vide, donc la boîte name était vide. Dans de prochains labs, vous apprendrez à détecter cette situation et à afficher un message d'erreur. Pour l'instant, vous avez construit un script fluide, prêt pour l'automatisation !
La différence entre la saisie interactive et les arguments de ligne de commande est fondamentale. read pose une question pendant l'exécution, tandis que $1 est disponible dès le début. De nombreux outils Unix sont conçus autour des arguments, car ceux-ci sont plus faciles à automatiser, documenter, répéter et combiner avec d'autres commandes.
Résumé
Félicitations ! Vous avez appris l'art de l'écoute.
Dans ce lab, vous avez découvert :
- Mode interactif : utiliser
readpour dialoguer avec l'utilisateur (adapté aux personnes). - Mode avec arguments : utiliser
$1pour accepter des données au lancement du script (adapté aux robots et à l'automatisation).
Vous avez également appris que les variables, comme $name, sont simplement des boîtes étiquetées dans lesquelles les scripts stockent des informations. Ce concept constitue le fondement de toute programmation !



