Bash est livré avec un certain nombre de commandes intégrées que vous pouvez utiliser sur la ligne de commande ou dans vos scripts shell.
Dans cet article, nous allons explorer le read
intégré commande.
Bash read
# intégré
read
est une commande intégrée bash qui lit une ligne depuis l'entrée standard (ou depuis le descripteur de fichier) et divise la ligne en mots. Le premier mot est attribué au prénom, le deuxième au deuxième nom, et ainsi de suite.
La syntaxe générale du read
intégré prend la forme suivante :
read [options] [name...]
Pour illustrer le fonctionnement de la commande, ouvrez votre terminal, tapez read var1 var2
, et appuyez sur "Entrée". La commande attendra que l'utilisateur entre l'entrée. Tapez deux mots et appuyez sur "Entrée".
read var1 var2
Hello, World!
Les mots sont assignés aux noms qui sont passés au read
commande comme arguments. Utiliser echo
ou printf
pour le vérifier :
echo $var1
echo $var2
Hello,
World!
Au lieu de taper sur le terminal, vous pouvez passer l'entrée standard à read
en utilisant d'autres méthodes telles que tuyauterie, here-string ou heredoc :
echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")
read
et echo
sont entre parenthèses et exécutés dans le même sous-shell.Hello,
World!
Voici un exemple utilisant une chaîne here et printf
:
read -r var1 var2 <<< "Hello, World!"
printf "var1: %s \nvar2: %s\n" "$var1" "$var2"
Var1: Hello,
Var2: World!
Lorsqu'aucun argument n'est fourni au read
commande, toute la ligne est affectée à la REPLY
variables :
echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!
Si le nombre d'arguments fournis à read
est supérieur au nombre de mots lus depuis l'entrée, les mots restants sont affectés au nom de famille :
echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")
Var1: Linux
Var2: is awesome.
Sinon, si le nombre d'arguments est inférieur au nombre de noms, une valeur vide est affectée aux noms restants :
echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")
Var1: Hello,
Var2: World!
Var3:
Par défaut, read
interprète la barre oblique inverse comme un caractère d'échappement, ce qui peut parfois provoquer un comportement inattendu. Pour désactiver l'échappement antislash, appelez la commande avec le -r
option.
Ci-dessous un exemple montrant comment read
fonctionne lorsqu'il est invoqué avec et sans le -r
choix :
read <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, \tWorld!
Généralement, vous devez toujours utiliser read
avec le -r
option.
Changer le délimiteur #
Le comportement par défaut de read
consiste à diviser la ligne en mots en utilisant un ou plusieurs espaces, tabulations et retour à la ligne comme délimiteurs. Pour utiliser un autre caractère comme délimiteur, affectez-le à l'IFS
variable (séparateur de champ interne).
echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Quand IFS
est défini sur un caractère autre qu'un espace ou une tabulation, les mots sont séparés par exactement un caractère :
echo "Linux::is:awesome." | \
(IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")
La ligne est séparée en quatre mots. Le deuxième mot est une valeur vide représentant le segment entre les délimiteurs. Il est créé car nous avons utilisé deux caractères délimiteurs l'un à côté de l'autre (::
).
Var1: Linux
Var2:
Var3: is
Var4: awesome.
Vous pouvez utiliser plusieurs délimiteurs pour diviser la ligne. Lorsque vous spécifiez plusieurs délimiteurs, affectez les caractères à l'IFS
variable sans espace entre eux.
Voici un exemple utilisant _
un -
comme délimiteurs :
echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Chaîne d'invite #
Lors de l'écriture de scripts bash interactifs, vous pouvez utiliser la commande read
commande pour obtenir l'entrée de l'utilisateur.
Pour spécifier une chaîne d'invite, utilisez le -p
option. L'invite est imprimée avant le read
est exécuté et n'inclut pas de retour à la ligne.
Voici un exemple simple :
read -r -p "Are you sure?"
Généralement, vous utiliseriez le read
commande dans un while
boucle pour forcer l'utilisateur à donner une des réponses attendues.
Le code ci-dessous demandera à l'utilisateur de redémarrer le système :
while true; do
read -r -p "Do you wish to reboot the system? (Y/N): " answer
case $answer in
[Yy]* ) reboot; break;;
[Nn]* ) exit;;
* ) echo "Please answer Y or N.";;
esac
done
Si le script shell demande aux utilisateurs d'entrer des informations sensibles, comme un mot de passe, utilisez le -s
option qui indique read
pour ne pas imprimer l'entrée sur le terminal :
read -r -s -p "Enter your password: "
Attribuer les mots au tableau #
Pour affecter les mots à un tableau au lieu de noms de variables, appelez le read
commande avec le -a
choix :
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
Lorsqu'un tableau et un nom de variable sont donnés, tous les mots sont affectés au tableau.
Conclusion #
Le read
La commande est utilisée pour diviser une ligne d'entrée en mots.