Faire dialoguer son script : arguments et saisie utilisateur
Notions théoriques
Jusqu'ici, nos scripts affichaient toujours les mêmes informations. Pour être vraiment utiles, ils doivent pouvoir recevoir des données variables : quel dossier sauvegarder, quel nom d'utilisateur créer, etc. Il existe deux façons de faire entrer une information dans un script : les arguments (au lancement) et la saisie interactive (pendant l'exécution).
Les arguments du script
Quand vous lancez ./sauvegarde.sh /etc /var, Bash met automatiquement à disposition plusieurs variables spéciales :
| Variable | Contenu |
|---|---|
$0 | Le nom du script lui-même |
$1, $2, ... $9 | Le 1er, 2e, ... 9e argument |
${10} | Le 10e argument (accolades nécessaires au-delà de 9) |
$# | Le nombre d'arguments reçus |
$@ | Tous les arguments |
#!/bin/bash
echo "Script : $0"
echo "Premier argument : $1"
echo "Nombre d'arguments : $#"
Écrivez toujours "$1", "$2", "$@" entre guillemets doubles. Un argument peut contenir un espace (par exemple un nom de dossier "Mes Documents") ; sans guillemets, Bash le découperait en plusieurs arguments distincts.
La différence entre "$@" et "$*" devient importante avec plusieurs arguments : "$@" conserve chaque argument séparément (recommandé), alors que "$*" les regroupe en une seule chaîne. Pour le niveau 1, retenez simplement "$@".
Décaler les arguments avec shift
La commande shift décale tous les arguments d'un cran : ce qui était $2 devient $1, etc. C'est utile pour traiter les arguments un par un dans une boucle (nous y reviendrons en séance 5).
La saisie interactive avec read
La commande read met en pause le script et attend que l'utilisateur tape quelque chose au clavier :
read reponse
echo "Vous avez tapé : $reponse"
Options courantes :
| Option | Effet |
|---|---|
-p "texte" | Affiche une question avant de lire (sur la même ligne) |
-s | Saisie invisible (mots de passe) |
-r | Empêche l'interprétation des antislashs (bonne pratique par défaut) |
read -rp "Quel est votre prénom ? " prenom
echo "Bonjour $prenom !"
Ne demandez et ne passez jamais de mot de passe en argument de script (./script.sh motdepasse) : les arguments sont visibles par tous les utilisateurs via la commande ps, et restent dans l'historique du terminal. Utilisez read -s pour une saisie invisible.
Arguments ou read : comment choisir ?
- Les arguments conviennent à un script destiné à être automatisé (lancé par un autre script, par une tâche planifiée...) : il ne doit pas s'arrêter pour attendre une réponse humaine.
- La saisie interactive convient à un script utilisé manuellement, où l'on souhaite guider l'utilisateur ou lui demander une confirmation.
Un script prévu pour être automatisé ne doit jamais poser de question avec read : personne ne serait là pour y répondre, et le script resterait bloqué.
Afficher un message d'usage
Il est recommandé qu'un script explique comment l'utiliser lorsqu'il est appelé sans argument :
echo "Usage : $0 <dossier>"
Exemple pratique
#!/bin/bash
# Script : bienvenue.sh
# Rôle : démontrer arguments et saisie interactive
echo "Nom du script : $0"
echo "Nombre d'arguments reçus : $#"
echo "Premier argument : $1"
read -rp "Voulez-vous continuer ? (o/n) " reponse
echo "Vous avez répondu : $reponse"
./bienvenue.sh /etc
Test de mémorisation/compréhension
TP pour réfl échir et résoudre des problèmes
Nous commençons ici la première version de sauvegarde.sh, le script fil rouge que nous allons enrichir au fil des séances suivantes.
Étape 1 — Récupérer le dossier à sauvegarder
Recopiez $1, $2... dans des variables au nom explicite dès le début du script (dossier_source, nom_utilisateur...). Le reste du script devient beaucoup plus lisible que s'il est parsemé de $1 dont on a oublié le sens.
Étape 2 — Afficher un message d'usage
Un script sans message d'usage oblige l'utilisateur à lire le code source pour comprendre comment s'en servir. Une ligne echo "Usage : ..." suffit à rendre un script exploitable par quelqu'un d'autre.
Étape 3 — Demander confirmation avant d'agir
N'utilisez jamais read pour demander un mot de passe sans l'option -s : sans elle, le mot de passe s'affiche en clair à l'écran pendant la saisie.