Aller au contenu principal

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 :

VariableContenu
$0Le nom du script lui-même
$1, $2, ... $9Le 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 : $#"
attention

É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 :

OptionEffet
-p "texte"Affiche une question avant de lire (sur la même ligne)
-sSaisie invisible (mots de passe)
-rEmpêche l'interprétation des antislashs (bonne pratique par défaut)
read -rp "Quel est votre prénom ? " prenom
echo "Bonjour $prenom !"
danger

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.
info

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


Dans ./sauvegarde.sh /etc /var, que vaut $2 ?


Que contient la variable $# ?


Quelle option de read affiche une question sur la même ligne que la saisie ?


Pourquoi écrire "$@" plutôt que $@ ?


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


Bonne pratique - Donner un nom parlant à ses arguments

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


Bonne pratique - Toujours prévoir 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


attention

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.

📌 Une solution