Ricerca nel sito web

Diversi modi per leggere il file nello script Bash utilizzando il ciclo While


Questo articolo spiega come leggere i file negli script bash utilizzando un ciclo while. La lettura di un file è un'operazione comune nella programmazione. Dovresti avere familiarità con diversi metodi e quale metodo è più efficiente da utilizzare. In bash, una singola attività può essere portata a termine in molti modi, ma esiste sempre un modo ottimale per portare a termine l'attività e dovremmo seguirlo.

Prima di vedere come leggere il contenuto dei file utilizzando il ciclo while, una rapida introduzione su come funziona il ciclo while. Il ciclo While valuta una condizione ed esegue un'iterazione su un determinato insieme di codici quando la condizione è vera.

while [ CONDITION ]
do
    code block
done

Analizziamo la sintassi del ciclo while.

  • Il ciclo while dovrebbe iniziare con una parola chiave while seguita da una condizione.
  • Una condizione deve essere racchiusa tra [ ] o [[ ]]. La condizione dovrebbe sempre restituire true affinché il ciclo venga eseguito.
  • Il blocco di codice effettivo verrà posizionato tra do e done.
NUMBER=0

while [[ $NUMBER -le 10 ]]
do
    echo " Welcome ${NUMBER} times "
    (( NUMBER++ ))
done

Questo è un esempio molto semplice, in cui il loop viene eseguito finché NUMBER non è maggiore di 10 e stampa l'istruzione echo.

Insieme a mentre utilizzeremo il comando read per leggere il contenuto di un file riga per riga. Di seguito è riportata la sintassi di come vengono combinati i comandi when e read. Ora ci sono diversi modi per passare il file come input e li vedremo tutti.

SYNTAX
while read VARIABLE
do
    code
done

Tubazioni in Linux

Normalmente utilizzeremo il comando cat per visualizzare il contenuto del file dal terminale. Inoltre, collegheremo l'output del comando cat ad altri comandi come grep, sort, ecc.

Allo stesso modo, utilizzeremo qui il comando cat per leggere il contenuto del file e collegarlo a un ciclo mentre. A titolo dimostrativo, sto utilizzando il file /etc/passwd ma non è consigliabile modificare questo file, quindi prendi una copia di backup di questo file e giocaci se lo desideri.

cat /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Analizziamo cosa accadrà quando verrà inviato il codice sopra.

  • cat /etc/passwd leggerà il contenuto del file e lo passerà come input attraverso la pipe.
  • Il comando read legge ogni riga passata come input dal comando cat e la memorizza nella variabile LREAD.
  • Il comando read leggerà il contenuto del file fino all'interpretazione dell'EOL.

Puoi anche usare altri comandi come head, tail e collegarlo al ciclo while.

head -n 5 /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Reindirizzamento degli input in Linux

Possiamo reindirizzare il contenuto del file al ciclo while utilizzando l'operatore di reindirizzamento di input (<).

while read LREAD
do
    echo ${LREAD}
done < /etc/passwd | head -n 5

È inoltre possibile memorizzare il nome del file in una variabile e passarlo tramite un operatore di reindirizzamento.

FILENAME="/etc/passwd"

while read LREAD
do
    echo ${LREAD}
done < ${FILENAME}

Puoi anche passare i nomi dei file come argomento al tuo script.

while read LREAD
do
    echo ${LREAD}
done < $1 | head -n 5

Separatore di campo interno

Potresti lavorare con diversi tipi di formati di file (CSV, TXT, JSON) e potresti voler dividere il contenuto del file in base a un delimitatore personalizzato. In questo caso, puoi utilizzare il "Separatore di campo interno (IFS)" per dividere il contenuto del file e memorizzarlo in variabili.

Lasciatemi dimostrare come funziona. Dai un'occhiata al file /etc/passwd che ha i due punti (:) come delimitatore. Ora puoi dividere ogni parola da una riga e memorizzarla in una variabile separata.

Nell'esempio seguente, sto dividendo il file /etc/passwd con i due punti come separatore e memorizzando ciascuna divisione in variabili diverse.

while IFS=":" read A B C D E F G
do
    echo ${A}
    echo ${B}
    echo ${C}
    echo ${D}
    echo ${E}
    echo ${F}
    echo ${G}
done < /etc/passwd

Ho visualizzato solo una riga divisa nello screenshot sopra considerando le dimensioni dello screenshot.

Righe vuote in Linux

Le righe vuote non vengono ignorate quando si scorre il contenuto del file. Per dimostrarlo ho creato un file di esempio con il contenuto seguente. Sono presenti 4 righe e poche righe vuote, spazi bianchi iniziali, spazi bianchi finali, caratteri di tabulazione nella riga 2 e alcuni caratteri di escape (\n e \t).

while read LREAD
do
    echo ${LREAD}
done < testfile

Guarda il risultato, la riga vuota non viene ignorata. Inoltre, una cosa interessante da notare è il modo in cui gli spazi bianchi vengono tagliati dal comando leggi. Un modo semplice per ignorare le righe vuote durante la lettura del contenuto del file è utilizzare l'operatore test con il flag -z che controlla se la lunghezza della stringa è zero. Ora ripetiamo lo stesso esempio ma questa volta con un operatore di test.

while read LREAD
do
    if [[ ! -z $LREAD ]]
    then
        echo ${LREAD} 
    fi
done < testfile

Ora dall'output puoi vedere che le righe vuote vengono ignorate.

Personaggi di fuga

I caratteri di escape come \n, \t, \c non verranno stampati durante la lettura di un file. Per dimostrarlo sto usando lo stesso file di esempio che ha pochi caratteri di escape.

while read LREAD
do
    echo ${LREAD}
done < testfile

Puoi vedere dall'output che i caratteri di escape hanno perso il loro significato e vengono stampati solo n e t invece di \n e \t . Puoi usare -r per impedire l'interpretazione della barra rovesciata.

while read -r LREAD
do
    echo ${LREAD}
done < testfile

Per questo articolo è tutto. Ci piacerebbe sentire la tua opinione se ci sono feedback o suggerimenti. Il tuo feedback è ciò che ci aiuta a creare contenuti migliori. Continua a leggere e continua a supportare.