Come leggere il valore di una variabile dallo stdin con read

29 dic 2020 3 min di lettura
Come leggere il valore di una variabile dallo stdin con read
Indice dei contenuti

Introduzione

Bash viene fornito con una serie di comandi incorporati che è possibile utilizzare sulla riga di comando o negli script della shell.

In questo articolo, esploreremo il comando integrato read.

Bash integrato read

read è un comando integrato di bash che legge una riga dallo standard input (o dal descrittore di file) e divide la riga in parole. La prima parola è assegnata al primo nome, la seconda al secondo nome e così via.

La sintassi generale del comando built-in read assume la seguente forma:

read [options] [name...]

Per illustrare come funziona il comando, apri il terminale, digita read var1 var2 e premi Invio. Il comando attenderà che l'utente inserisca l'input. Digita due parole e premi Invio.

read var1 var2

Le parole vengono assegnate ai nomi passati al  comando read come argomenti. Usa echo o printf per verificarlo:

echo $var1
echo $var2
Hello,
World!

Invece di digitare sul terminale, puoi passare l'input standard al comando read utilizzando altri metodi come piping, here-string o heredoc:

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

read e echo sono racchiusi tra parentesi ed eseguiti nella stessa sottoshell.

Hello,
World!

Ecco un esempio che utilizza una stringa qui e printf:

read -r var1 var2 <<< "Hello, World!"
Var1: Hello, 
Var2: World! 

Quando non viene fornito alcun argomento al comando read, l'intera riga viene assegnata alla variabile REPLY:

echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!

Se il numero di argomenti forniti al comando read è maggiore del numero di parole lette dall'ingresso, le restanti parole vengono assegnate all'ultimo nome:

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.

È possibile utilizzare più di un delimitatore per dividere la riga. Quando si specificano più delimitatori, assegnare i caratteri alla variabile IFS senza uno spazio tra di loro.

Ecco un esempio che utilizza _ un - come delimitatori:

echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux 
is 
awesome.

Prompt String

Quando si scrivono script bash interattivi, è possibile utilizzare il comando read per ottenere l'input dell'utente.

Per specificare una stringa di prompt, utilizzare l'opzione -p. Il prompt viene stampato prima che venga eseguito read e non include una nuova riga.

Qui c'è un semplice esempio:

read -r -p "Are you sure?"

Generalmente, useresti il comando read all'interno di un ciclo while per costringere l'utente a fornire una delle risposte previste.

Il codice seguente richiederà all'utente il riavvio del 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

Se lo script della shell chiede agli utenti di inserire informazioni sensibili, come la password, utilizzare l'opzione -s che dice al comando read non stampare l'input sul terminale:

read -r -s -p "Enter your password: "

Assegnare le parole alla matrice

Per assegnare le parole a un array invece di nomi di variabili, invoca il comando read con l'opzione -a:

read -r -a MY_ARR <<< "Linux is awesome."

for i in "${MY_ARR[@]}"; do 
  echo "$i"
done
Linux 
is 
awesome.

Quando vengono forniti sia un array che un nome di variabile, tutte le parole vengono assegnate all'array.

Conclusione

Il comando read viene utilizzato per dividere una riga di input in parole.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.