Aperçu
read joue un rôle essentiel lorsque les scripts doivent obtenir des informations de l'utilisateur, ou lire et attribuer des données à des variables à partir de pipes ou de fichiers. Diverses options permettent un contrôle fin sur la manière dont l'entrée est traitée.
Fonctionnalités principales
- Lire une ligne d'entrée de l'utilisateur
- Stocker l'entrée dans des variables
- Afficher un message de prompt
- Définir un délai d'attente pour l'entrée
- Masquer les entrées sensibles comme les mots de passe
Options principales
Les principales options de la commande read aident à contrôler de diverses manières le traitement de l'entrée utilisateur.
Contrôle de l'entrée
Commande générée :
Essayez de combiner les commandes.
Description:
`read` Exécute la commande.
Essayez d'exécuter virtuellement les commandes avec l'IA en combinant les options ci-dessus.
Exemples d'utilisation
Vous pouvez apprendre à traiter les entrées utilisateur grâce aux divers exemples d'utilisation de la commande read.
Lecture d'entrée de base
read name
echo "Bonjour, $name !"
Lit le nom de l'utilisateur et le stocke dans une variable.
Lecture avec un prompt
read -p "Quelle est votre couleur préférée ? " color
echo "Vous aimez le $color."
Pose une question à l'utilisateur et lit la réponse.
Définir un délai d'attente
echo "Entrez votre nom dans les 5 secondes :"
read -t 5 name
name=${name:-"Invité"}
echo "Bonjour, $name !"
Si aucune entrée n'est reçue dans les 5 secondes, utilise la valeur par défaut.
Masquer la saisie du mot de passe
read -s -p "Entrez votre mot de passe : " password
echo "\nLe mot de passe a été saisi."
Empêche l'affichage des caractères saisis à l'écran.
Stocker l'entrée dans plusieurs variables
read -p "Entrez votre nom et votre âge (ex: Jean Dupont 30) : " name age
echo "Nom : $name, Âge : $age"
Divise l'entrée séparée par des espaces et la stocke dans plusieurs variables dans l'ordre.
Lire un fichier ligne par ligne
echo -e "Ligne 1\nLigne 2\nLigne 3" > example.txt
while IFS= read -r line; do
echo "Ligne lue : $line"
done < example.txt
rm example.txt
Un modèle courant pour lire et traiter le contenu d'un fichier ligne par ligne.
Conseils et précautions
Conseils et précautions pour utiliser la commande read de manière plus efficace et sécurisée.
Importance de l'utilisation de read -r
L'option read -r empêche l'interprétation du backslash (\) comme caractère d'échappement, le traitant comme un caractère littéral, garantissant ainsi que la chaîne d'entrée est stockée telle quelle dans la variable. Il est fortement recommandé de l'utiliser systématiquement, en particulier lors de la lecture d'entrées pouvant contenir des caractères spéciaux comme les chemins de fichiers, afin d'éviter la perte de données ou un comportement incorrect.
- Exemple (traitement du backslash): echo 'C:\Users\User' | read path; echo $path -> C:UsersUser (backslash supprimé) echo 'C:\Users\User' | read -r path; echo $path -> C:\Users\User (backslash conservé)
Utilisation de la variable IFS
La variable IFS (Internal Field Separator) définit les délimiteurs utilisés par la commande read pour séparer l'entrée en mots. La valeur par défaut est l'espace, la tabulation et le caractère de nouvelle ligne. En modifiant IFS, vous pouvez facilement analyser des données séparées par des virgules (,) ou des deux-points (:).
- Exemple (séparation par virgule): echo "pomme,banane,cerise" | IFS=, read -r fruit1 fruit2 fruit3 echo "Premier fruit : $fruit1, Deuxième fruit : $fruit2"
Attention à la sécurité : Ne pas utiliser avec eval
L'utilisation directe de la valeur saisie par l'utilisateur avec la commande eval est extrêmement dangereuse en termes de sécurité. Elle peut créer une vulnérabilité permettant à un utilisateur malveillant d'exécuter du code arbitraire. Les entrées utilisateur doivent toujours être considérées comme des données non fiables et doivent être rigoureusement validées si nécessaire.
- Mauvais exemple: read -p "Entrez une commande : " cmd eval "$cmd" # N'utilisez JAMAIS cela !
Modèle while read pour le traitement de fichiers
Le modèle `while IFS= read -r line` est très puissant et efficace pour lire et traiter le contenu d'un fichier ligne par ligne. `IFS=` empêche la suppression des espaces en début et fin de ligne, et `-r` empêche le traitement des backslashes, permettant ainsi de lire le contenu du fichier avec précision.
- Utilisation typique: while IFS= read -r line; do # Chaque ligne du fichier est stockée dans la variable $line. echo "Traitement : $line" done < votre_fichier.txt