Read

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Shell (builtin bash)
Commande read
Contexte Saisie interactive, lecture ligne par ligne d'un fichier, saisie masquée d'un mot de passe
Voir aussi Scripts bash utilisant des boucles while read

read est une commande interne du shell (builtin) qui lit une ligne sur l'entrée standard et affecte son contenu à une ou plusieurs variables. Elle sert aussi bien à demander une saisie interactive à l'utilisateur qu'à parcourir un fichier ligne par ligne dans un script.

Usage de base

echo "Voulez-vous faire cette action (y/n) ?"
read reponse
if [[ "$reponse" = y ]]; then
  echo "action à faire"
fi

⚠️ On lit dans la variable (read reponse), pas dans son contenu — écrire read $reponse est une erreur fréquente : bash tenterait de lire dans le nom de variable déjà résolu (vide au premier lancement) au lieu de la variable elle-même.

Options courantes

read -p "Nom : " nom          # -p : affiche un prompt avant la saisie
read -s -p "Password : " pass # -s : saisie masquée (silent), rien n'est affiché à l'écran
read -t 10 -p "Réponse : " rep # -t : timeout en secondes, read échoue si rien n'est saisi à temps
read -a tab -p "Valeurs : "   # -a : éclate la saisie dans un tableau (un mot par élément)
echo ""                       # -s ne saute pas de ligne après l'entrée, un echo est utile pour la lisibilité

Ces options se combinent : read -s -t 10 -p "Password : " pass demande un mot de passe masqué avec un délai maximal de 10 secondes.

Lire un fichier ligne par ligne

Le motif classique pour traiter un fichier ligne par ligne dans un script :

while IFS= read -r ligne; do
  echo "Ligne lue : $ligne"
done < /chemin/vers/fichier.txt

IFS= évite que les espaces en début/fin de ligne soient supprimés, et -r empêche l'interprétation des antislashs comme caractères d'échappement — les deux sont recommandés par défaut pour une lecture fidèle du fichier.

Masquer une saisie (mot de passe)

L'option -s de read suffit dans la grande majorité des cas :

read -s -p "Password: " password
echo ""
echo "Mot de passe saisi (longueur : ${#password})"

Avant que cette option existe largement, la même chose se faisait manuellement avec stty pour couper puis restaurer l'écho du terminal :

save_state=$(stty -g)
echo -n "Password: "
stty -echo
read password
stty "$save_state"
echo ""

Dans les deux cas, éviter d'afficher le mot de passe en clair ensuite (y compris dans les logs) — se contenter de sa longueur ou de son usage direct suffit pour vérifier que la saisie a fonctionné.

Voir aussi

  • Chkconfig — autre commande shell historique documentée sur ce wiki