Quando si scrivono script Bash, a volte ci si trova in situazioni in cui è necessario leggere un file riga per riga. Ad esempio, potresti avere un file di testo contenente dati che dovrebbero essere elaborati dallo script.

In questo tutorial, discuteremo come leggere un file riga per riga in Bash.,

la Lettura di un File riga per Riga Sintassi #

La maggior parte sintassi generale per la lettura di un file riga per riga come segue:

while IFS= read -r line; do printf '%s\n' "$line"done < input_file

o l’equivalente a linea singola versione:

while IFS= read -r line; do printf '%s\n' "$line"; done < input_file

Come funziona?

Il file di input (input_file) è il nome del file reindirizzato al ciclo while. Il comandoread elabora il file riga per riga, assegnando ogni riga alla variabileline. Una volta elaborate tutte le linee, il ciclo while termina.,

Per impostazione predefinita, il comandoread interpreta il backslash come un carattere di escape e rimuove tutti gli spazi bianchi iniziali e finali, che a volte possono causare un comportamento imprevisto. Per disabilitare l’escape della barra rovesciata, stiamo invocando il comando con l’opzione-r e per disabilitare il taglio, il separatore di campo interno (IFS) viene eliminato.

Stiamo usando invece diecho per rendere il codice più portabile e per evitare comportamenti indesiderati., Ad esempio, se la riga contiene valori come “-e”, verrà trattata come opzione echo.

Leggendo un file Riga per riga Esempi #

Diamo un’occhiata al seguente esempio. Supponiamo di avere un file chiamato distros.txt contenente un elenco di alcune delle distribuzioni Linux più popolari e i loro gestori di pacchetti separati da virgola (,):

distribuzioni.,txt
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf

Per leggere il file riga per riga, dovresti eseguire il seguente codice nel tuo terminale:

while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt

Il codice legge il file per riga, assegna ogni riga a una variabile e la stampa. Fondamentalmente, si vedrebbe lo stesso output come se si visualizzasse il contenuto del file utilizzando il comando cat.

Cosa succede se si desidera stampare solo le distribuzioni che utilizzano apt?, Un modo potrebbe essere quello di utilizzare il if istruzione e controllare se la riga contiene l’apt sottostringa :

while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt

Durante la lettura di un file riga per riga, si può passare anche più di una variabile read comando, che dividerà la riga in campi basato su IFS. Il primo campo viene assegnato alla prima variabile, la seconda alla seconda variabile e così via. Se ci sono più campi che variabili, i campi rimanenti vengono assegnati all’ultima variabile.,

Nell’esempio seguente, impostiamo IFS su una virgola (,) e passiamo due variabili distro e pm al read comando.,erything dall’inizio della linea fino al primo comma verrà assegnato alla prima variabile (distro), e il resto della riga verrà assegnata la seconda variabile (pm):

while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora

Alternative di Lettura del File di Metodi di #

l’Utilizzo di un Processo di Sostituzione #

il Processo di sostituzione è una funzione che consente di utilizzare l’output del comando in un file:

while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )

l’Utilizzo di un Qui Stringa #

Qui si tratta di una variante del documento ., La stringa (cat input_file ) mantiene il punto e a capo:

while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )

Utilizzando il descrittore di File #

Si può anche fornire l’input per il ciclo utilizzando un descrittore di file:

while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file

Quando si lavora con i descrittori di file , utilizzare un numero compreso tra 4 e 9, per evitare conflitti con guscio interno descrittori di file.

Conclusione #

In Bash, possiamo leggere un file riga per riga usando un ciclo while e il comandoread.