
Bash viene fornito con una serie di comandi integrati che puoi utilizzare sulla riga di comando o negli script della shell.
In questo articolo, esploreremo la read
incorporata comando.
Bash read
#
integrato
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 nome, la seconda al secondo nome e così via.
La sintassi generale di read
built-in assume la forma seguente:
read [options] [name...]
Per illustrare come funziona il comando, apri il tuo 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
Hello, World!
Le parole vengono assegnate ai nomi che vengono passati al read
comando come argomenti. Usa echo
o printf
per verificarlo:
echo $var1
echo $var2
Hello,
World!
Invece di digitare sul terminale, puoi passare l'input standard a 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 subshell.Hello,
World!
Ecco un esempio usando una stringa here e printf
:
read -r var1 var2 <<< "Hello, World!"
printf "var1: %s \nvar2: %s\n" "$var1" "$var2"
Var1: Hello,
Var2: World!
Quando non viene fornito alcun argomento a read
comando, l'intera riga è assegnata al REPLY
variabile:
echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!
Se il numero di argomenti forniti a read
è maggiore del numero di parole lette dall'ingresso, le restanti parole vengono assegnate al cognome:
echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")
Var1: Linux
Var2: is awesome.
In caso contrario, se il numero di argomenti è inferiore al numero di nomi, ai nomi rimanenti viene assegnato un valore vuoto:
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 comportamenti imprevisti. Per disabilitare l'escape della barra rovesciata, invoca il comando con -r
opzione.
Di seguito è riportato un esempio che mostra come read
funziona quando viene invocato con e senza -r
opzione:
read <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, \tWorld!
In generale, dovresti sempre usare read
con il -r
opzione.
Modifica del delimitatore #
Il comportamento predefinito di read
è dividere la riga in parole usando uno o più spazi, tabulazioni e newline come delimitatori. Per utilizzare un altro carattere come delimitatore, assegnalo a IFS
variabile (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 da spazio o tabulazione, le parole sono separate esattamente da un carattere:
echo "Linux::is:awesome." | \
(IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")
La riga è divisa in quattro parole. La seconda parola è un valore vuoto che rappresenta il segmento tra i delimitatori. È stato creato perché abbiamo utilizzato due caratteri delimitatori uno accanto all'altro(::
).
Var1: Linux
Var2:
Var3: is
Var4: awesome.
Puoi usare più di un delimitatore per dividere la linea. Quando si specificano più delimitatori, assegnare i caratteri all'IFS
variabile senza uno spazio tra di loro.
Ecco un esempio usando _
un -
come delimitatori:
echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Stringa di richiesta #
Quando scrivi script bash interattivi, puoi usare read
comando per ottenere l'input dell'utente.
Per specificare una stringa di richiesta, utilizzare il -p
opzione. Il prompt viene stampato prima di read
viene eseguito e non include una nuova riga.
Ecco un semplice esempio:
read -r -p "Are you sure?"
In genere, dovresti usare read
comando all'interno di un while
loop 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 riservate, come la password, utilizzare -s
opzione che dice a read
non stampare l'input sul terminale:
read -r -s -p "Enter your password: "
Assegna le parole all'array #
Per assegnare le parole a un array invece di nomi di variabili, invocare read
comando con il -a
opzione:
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
Quando vengono assegnati sia un array che un nome di variabile, tutte le parole vengono assegnate all'array.
Conclusione #
Il read
comando viene utilizzato per dividere una riga di input in parole.