Bash viene con varios comandos integrados que puede usar en la línea de comandos o en sus scripts de shell.
En este artículo, exploraremos el read
integrado comando.
Bash read
# incorporado
read
es un comando incorporado de bash que lee una línea de la entrada estándar (o del 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 de read
incorporado toma la siguiente forma:
read [options] [name...]
Para ilustrar cómo funciona el comando, abra su terminal, escriba read var1 var2
, y presione "Entrar". El comando esperará a que el usuario ingrese la entrada. Escribe dos palabras y presiona "Enter".
read var1 var2
Hello, World!
Las palabras se asignan a los nombres que se pasan al read
comando como argumentos. Usar echo
o printf
para verificarlo:
echo $var1
echo $var2
Hello, World!
En lugar de escribir en la terminal, puede pasar la entrada estándar a read
utilizando otros métodos como canalización, 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 here y printf
:
read -r var1 var2 <<< "Hello, World!"
printf "var1: %s \nvar2: %s\n" "$var1" "$var2"
Var1: Hello,
Var2: World!
Cuando no se proporciona ningún argumento a read
comando, toda la línea se asigna a REPLY
variables:
echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!
Si el número de argumentos suministrados a read
es mayor que el número de palabras leídas de 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.
De lo contrario, si el número de argumentos es menor que el número de nombres, se asigna un valor vacío a los nombres restantes:
echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")
Var1: Hello,
Var2: World!
Var3:
Por defecto, read
interpreta la barra invertida como un carácter de escape, lo que a veces puede provocar un comportamiento inesperado. Para deshabilitar el escape de barra invertida, invoque el comando con -r
opción.
A continuación se muestra un ejemplo que muestra cómo read
funciona cuando se invoca con y sin -r
opción:
read <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, World!
read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, \tWorld!
En general, siempre debe usar read
con el -r
opción.
Cambiando el Delimitador #
El comportamiento predeterminado de read
es dividir la línea en palabras usando uno o más espacios, tabulaciones y nueva línea como delimitadores. Para usar otro carácter como delimitador, asígnelo al IFS
variable (separador de campo interno).
echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Cuando IFS
se establece en un carácter que no sea espacio o tabulación, las palabras están separadas por exactamente un carácter:
echo "Linux::is:awesome." | \
(IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")
La línea se separa en cuatro palabras. La segunda palabra es un valor vacío que representa el segmento entre los delimitadores. Se crea porque usamos dos caracteres delimitadores uno al lado del otro (::
).
Var1: Linux
Var2:
Var3: is
Var4: awesome.
Puede usar más de un delimitador para dividir la línea. Al especificar múltiples delimitadores, asigne los caracteres al IFS
variable sin espacio entre ellas.
Aquí hay un ejemplo usando _
un -
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 n.°
Al escribir scripts de bash interactivos, puede usar el read
comando para obtener la entrada del usuario.
Para especificar una cadena de solicitud, use -p
opción. El indicador se imprime antes de read
se ejecuta y no incluye una nueva línea.
He aquí un ejemplo sencillo:
read -r -p "Are you sure?"
En general, usaría el read
comando dentro de un while
bucle para obligar al usuario a dar una de las respuestas esperadas.
El siguiente código solicitará 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 una contraseña, use -s
opción que le dice a read
no imprimir la entrada en el terminal:
read -r -s -p "Enter your password: "
Asigne las palabras a la matriz #
Para asignar las palabras a una matriz en lugar de nombres de variables, invoque el read
comando con -a
opción:
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
Cuando se dan tanto una matriz como un nombre de variable, todas las palabras se asignan a la matriz.
Conclusión #
El read
El comando se usa para dividir una línea de entrada en palabras.