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

reades 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 readtiene la siguiente forma:

read [options] [name...]

Para ilustrar cómo funciona el comando, abra la terminal, escriba read var1 var2y 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 readcomo argumentos. Utilice echoo printfpara comprobarlo:

echo $var1
echo $var2
Hello,
World!

En lugar de escribir en la terminal, puede pasar la entrada estándar al comando readusando otros métodos como piping, here-string o heredoc :

echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")

ready echoestá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 reades 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 IFSsin 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 readpara obtener la entrada del usuario.

Para especificar una cadena de solicitud, use la opción -p. La solicitud se imprime antes de ejecutarse ready no incluye una nueva línea.

Aquí hay un ejemplo simple:

read -r -p "Are you sure?"

Generalmente, usaría el comando readdentro de un ciclo whilepara 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 -sque le dice al comando que readno 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 readcon 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 readse usa para dividir una línea de entrada en palabras.