Introduzione
Il Bash read
command è un'utilità integrata che legge il testo dall'input standard. Lo strumento offre molte funzionalità per leggere l'input dell'utente, contribuendo a rendere gli script Bash interattivi.
Questa guida spiega come read
Bash comando funziona attraverso vari esempi e casi d'uso.

Prerequisiti
- Accesso alla riga di comando/terminale.
- Nozioni di base sull'utilizzo delle variabili di ambiente.
Sintassi di lettura Bash
La sintassi per Bash read
il comando è:
read <options> <arguments>
Il read
Il comando prende l'input dell'utente e divide la stringa in campi, assegnando ogni nuova parola a un argomento. Se ci sono meno variabili delle parole, read
memorizza i termini rimanenti nella variabile finale.
La specifica dei nomi degli argomenti è facoltativa. Il comando memorizza l'input di un utente nel $REPLY
variabile per impostazione predefinita.
Opzioni di lettura Bash
Il Bash read
comando viene fornito con molte opzioni per controllare l'input dell'utente. Alcune opzioni non richiedono parametri aggiuntivi, mentre altre hanno parametri obbligatori.
La tabella seguente mostra tutte le possibili opzioni di comando e la loro descrizione.
Opzione | Descrizione |
---|---|
-a <array> | Assegna la sequenza di parole fornita a una variabile denominata <array> . |
-d <delimiter> | Legge una riga fino al <delimiter> fornito invece di una nuova riga. |
-e | Avvia una sessione di shell interattiva per ottenere la riga da leggere. |
-i <prefix> | Aggiunge il testo iniziale prima di leggere una riga come prefisso. |
-n <number> | Ritorna dopo aver letto il numero di caratteri specificato rispettando il delimitatore per terminare anticipatamente. |
-N <number> | Restituisce dopo aver letto il numero di caratteri specificato, ignorando il delimitatore. |
-p <prompt> | Emette la stringa di richiesta prima di leggere l'input dell'utente. |
-r | Disabilita le barre rovesciate per eseguire l'escape dei caratteri. |
-s | Non fa eco all'input dell'utente. |
-t <time> | Il comando scade dopo il tempo specificato in secondi. |
-u <file descriptor> | Lettura dal descrittore di file invece dello standard input. |
Continua a leggere per vedere come leggere il comando funziona attraverso vari esempi.
Esempi di lettura di Bash
Il read
funzioni di comando senza argomenti o opzioni. Per testare il comando, segui i passaggi seguenti:
1. Apri il terminale.
2. Scrivi il comando e premi Invio :
read

Il prompt attende l'input dell'utente.
3. Digita una frase e premi Invio .

Il terminale torna al suo stato normale.
4. Recupera il messaggio con il comando echo:
echo $REPLY

Il $REPLY
la variabile memorizza il read
messaggio di comando.
Di seguito sono riportati esempi che dimostrano casi d'uso più complessi per Bash read
comando.
Argomenti
Salva l'input dell'utente in una variabile specificata fornendo un argomento:
read input
Recupera il messaggio con:
echo $input

In alternativa, dividi l'input dell'utente in variabili diverse aggiungendo più argomenti.
Ad esempio:
read var1 var2
L'input dell'utente si divide in singole parole. Recuperali con:
echo $var1
echo $var2

Quando l'input dell'utente ha più parole di quante siano le variabili, le parole extra vengono assegnate all'ultima variabile fornita:
read var1 var2
foo bar baz
echo $var1
echo $var2

Se ci sono meno parole rispetto alle variabili, le restanti variabili sono vuote.
Condutture
Piping prende l'output standard da un comando e lo analizza come input standard per un altro processo. Usa echo
e invia le informazioni a read
per un'analisi immediata. Ad esempio:
echo "Hello world!" | (read var1 var2; echo $var1; echo $var2)

Le parentesi creano una subshell con più comandi e le singole variabili vengono stampate sulla console.
Heredoc
Un altro modo per inserire il testo nel read
comando sta usando la notazione heredoc. Ad esempio:
read var1 var2 <<< "Hello world!"
echo $var1
echo $var2

Il read
il comando prevede un flusso di input letterale e l'identificatore di reindirizzamento (<<<
) inserisce l'erestring.
Delimitatori
Il read
Il comando definisce due tipi di delimitatori:
1. Il delimitatore per il read
comando.
Per impostazione predefinita, premendo Invio (nuova riga) termina il comando. Aggiungi il -d
tag e fornire un delimitatore diverso tra virgolette per terminare in modo diverso.
Ad esempio:
read -d "-"

Invece di una nuova riga, il nuovo delimitatore è un trattino (-
) invece di una nuova riga. Il comando termina al raggiungimento del delimitatore, ignorando il numero di argomenti. La risposta in $REPLY
oppure la variabile fornita memorizza l'input dell'utente senza il trattino (-
).
2. Il delimitatore per dividere i campi.
La variabile $IFS
(Internal Field Separator) memorizza i delimitatori di parole. Il valore predefinito per cui le parole vengono divise è uno spazio " ". Imposta il $IFS
variabile a un valore diverso per controllare questo comportamento.
Ad esempio, per separare le parole con dei trattini, usa:
IFS="-"
echo "Hello-world!" | (read var1 var2; echo $var1; echo $var2)

Aggiungi separatori diversi per dividere i campi in base a valori diversi:
IFS="-_"
echo "Hello_world-!" | (read var1 var2 var3; echo $var1; echo $var2; echo $var3)

Il separatore è lungo un carattere e $IFS
prende ogni divisore indicato individualmente.
Richiesta
Utilizzare il comando di lettura per creare prompt interattivi. Aggiungi il -p
tag e fornisci il testo del prompt, ad esempio:
read -p "Enter your username: " username
Il testo del prompt viene stampato e richiede l'input dell'utente. Il testo viene salvato nella variabile $username
.
echo Your username is $username.

Usa il -p
opzione negli script Bash per lavorare con la creazione di prompt.
Nascondi input utente
Il read
comando offre il -s
tag per nascondere l'input di informazioni sensibili. Un caso d'uso comune consiste nel combinare -s
con il -p
tag per creare una richiesta di password.
Ad esempio:
read -p "Enter your password: "$'\n' -s password
L'input dell'utente è invisibile. Tuttavia, facendo eco al messaggio viene visualizzata la password:
echo $password

Fai attenzione a questo comportamento quando usi read
negli script che richiedono le password.
Imposta limite caratteri
Il comando di lettura offre due opzioni quando si limita il numero di caratteri per l'immissione dell'utente:
1. Usa il -n
opzione e fornire un numero per impostare il limite di caratteri. Ad esempio:
read -n 3

Premi Invio dopo un carattere per terminare il comando prima di raggiungere il limite di caratteri. Senza premere Invio , il comando esce automaticamente dopo tre caratteri.
2. Usa il -N
opzione e fornire un numero per impostare il limite di caratteri ignorando il delimitatore. Ad esempio:
read -N 3

Premendo Invio non termina il comando. Tuttavia, la sequenza di tasti conta come un carattere.
Imposta timeout
Imposta un timeout su read
per limitare il tempo impiegato per inserire il testo:
read -t 5
Il comando termina automaticamente dopo il limite di tempo previsto.
Array
Invece di utilizzare singole variabili per memorizzare una stringa, aggiungi il -a
opzione per salvare l'input in un array. Ad esempio:
read -a array <<< "Hello world!"
Recupera gli elementi dell'array con:
echo ${array[0]}
echo ${array[1]}

In alternativa, usa un ciclo for per scorrere l'array.
Caratteri di escape e barre rovesciate
Il read
il comando consente di dividere input lunghi in più righe utilizzando barre inverse. Ad esempio:
read password prompt terminal output
Hello \
world\
!

Premendo Invio dopo che la barra rovesciata non termina il comando e si aspetta un ulteriore input nella riga successiva.
Per ignorare l'interpretazione della barra rovesciata, aggiungi -r opzione:
read -r <<< "Hello\world!"; echo $REPLY

Utilizzare questa opzione durante l'analisi dei percorsi dei file e di qualsiasi testo in cui la barra rovesciata ha un significato.