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.