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.