Introducción
Bash viene con un conjunto de comandos integrados que puede usar en la línea de comandos o en scripts de shell.
En este artículo, exploraremos el comando integrado read
.
Integrado Bash leer
read
es un comando bash incorporado que lee una línea de la entrada estándar (o descriptor de archivo) y divide la línea en palabras. La primera palabra se asigna al primer nombre, la segunda al segundo nombre, y así sucesivamente.
La sintaxis general del comando integrado read
tiene la siguiente forma:
read [options] [name...]
Para ilustrar cómo funciona el comando, abra la terminal, escriba read var1 var2
y presione Invio
. El comando esperará a que el usuario ingrese la entrada. Escriba dos palabras y presione Invio
.
read var1 var2
Las palabras se asignan a los nombres que se pasan al comando read
como argumentos. Utilice echo
o printf
para comprobarlo:
echo $var1
echo $var2
Hello,
World!
En lugar de escribir en la terminal, puede pasar la entrada estándar al comando read
usando otros métodos como piping, here-string o heredoc :
echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")
read
y echo
están entre paréntesis y se ejecutan en la misma subcapa.
Hello,
World!
Aquí hay un ejemplo usando una cadena aquí y printf
:
read -r var1 var2 <<< "Hello, World!"
Var1: Hello,
Var2: World!
Cuando no se dan argumentos al comando read
, toda la línea se asigna a la variable REPLY
:
echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!
Si el número de argumentos proporcionados al comando read
es mayor que el número de palabras leídas por la entrada, las palabras restantes se asignan al apellido:
echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")
Var1: Linux
Var2: is awesome.
Altrimenti, se il numero di argomenti è inferiore al numero di nomi, viene assegnato un valore vuoto ai nomi rimanenti:
echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")
Var1: Hello,
Var2: World!
Var3:
Per impostazione predefinita, read
interpreta la barra rovesciata come un carattere di escape, che a volte può causare un comportamento imprevisto. Per disabilitare l'escape della barra rovesciata, richiamare il comando con l'opzione -r
.
Di seguito è riportato un esempio che mostra come il comando read
funziona quando invocato con e senza l'opzione -r
:
read <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, \tWorld!
In generale, dovresti sempre usare il comando read
con l'opzione -r
.
Modificare del delimitatore
Il comportamento predefinito di read
è quello di dividere la riga in parole utilizzando uno o più spazi, tabulazioni e nuova riga come delimitatori. Per utilizzare un altro carattere come delimitatore, assegnarlo alla variabile IFS
(separatore di campo interno).
echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Quando IFS
è impostato su un carattere diverso dallo spazio o dalla tabulazione, le parole sono separate esattamente da un carattere:
echo "Linux::is:awesome." | \
La riga è divisa in quattro parole. La seconda parola è un valore vuoto che rappresenta il segmento tra i delimitatori. Viene creato perché abbiamo utilizzato due caratteri delimitatori uno accanto all'altro ::
.
Var1: Linux
Var2:
Var3: is
Var4: awesome.
Puede utilizar más de un delimitador para dividir la fila. Cuando especifique varios delimitadores, asigne caracteres a la variable IFS
sin un espacio entre ellos.
Aquí hay un ejemplo que utiliza _
una -
como delimitadores:
echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Cadena de solicitud
Al escribir scripts de bash interactivos, puede usar el comando read
para obtener la entrada del usuario.
Para especificar una cadena de solicitud, use la opción -p
. La solicitud se imprime antes de ejecutarse read
y no incluye una nueva línea.
Aquí hay un ejemplo simple:
read -r -p "Are you sure?"
Generalmente, usaría el comando read
dentro de un ciclo while
para forzar al usuario a proporcionar una de las respuestas esperadas.
El siguiente código le pedirá al usuario que reinicie el sistema :
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 el script de shell pide a los usuarios que ingresen información confidencial, como contraseñas, use la opción -s
que le dice al comando que read
no imprima la entrada en la terminal:
read -r -s -p "Enter your password: "
Asignar palabras a la matriz
Para asignar palabras a una matriz en lugar de nombres de variables, invoque el comando read
con la opción -a
:
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
Cuando se proporcionan tanto una matriz como un nombre de variable, todas las palabras se asignan a la matriz.
Conclusión
El comando read
se usa para dividir una línea de entrada en palabras.