Diferents maneres de llegir el fitxer a l'script Bash mitjançant el bucle While


Aquest article tracta sobre com llegir fitxers en scripts bash mitjançant un bucle while. La lectura d'un fitxer és una operació habitual en programació. Hauríeu d'estar familiaritzat amb diferents mètodes i quin mètode és més eficient d'utilitzar. En bash, una única tasca es pot aconseguir de moltes maneres, però sempre hi ha una manera òptima de fer la tasca i hem de seguir-la.

Abans de veure com llegir el contingut del fitxer utilitzant el bucle while, una introducció ràpida sobre com funciona el bucle while. El bucle while avalua una condició i itera sobre un conjunt determinat de codis quan la condició és certa.

while [ CONDITION ]
do
    code block
done

Anem a desglossar la sintaxi del bucle while.

  • El bucle while hauria de començar amb una paraula clau while seguida d'una condició.
  • Una condició s'ha d'incloure entre [ ] o [[ ]]. La condició hauria de tornar sempre cert perquè el bucle s'executi.
  • El bloc de codi real es col·locarà entre fer i fet.

NUMBER=0

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

Aquest és un exemple molt senzill, on el bucle s'executa fins que NUMBER no és més gran que 10 i imprimeix la instrucció d'eco.

Juntament amb while farem servir l'ordre read per llegir el contingut d'un fitxer línia per línia. A continuació es mostra la sintaxi de com es combinen les ordres while i read. Ara hi ha diferents maneres de passar el fitxer com a entrada i les veurem totes.

# SYNTAX
while read VARIABLE
do
    code
done

Piping a Linux

Normalment farem servir l'ordenació, etc.

De la mateixa manera, utilitzarem l'ordre cat aquí per llegir el contingut del fitxer i canalitzar-lo a un bucle while. Per a la demostració, estic fent servir el fitxer /etc/passwd, però no és recomanable fer-ho amb aquest fitxer, així que feu una còpia de seguretat d'aquest fitxer i jugueu-hi si ho voleu.

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

Desglossem què passarà quan s'enviï el codi anterior.

  • cat /etc/passwd llegirà el contingut del fitxer i el passarà com a entrada per la canonada.
  • l'ordre read llegeix cada línia passada com a entrada de l'ordre cat i l'emmagatzema a la variable LREAD.
  • l'ordre read llegirà el contingut del fitxer fins que s'interpreti EOL.

També podeu utilitzar altres ordres com el cap, la cua i la canalització al bucle while.

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

Redirecció d'entrada a Linux

Podem redirigir el contingut del fitxer al bucle while utilitzant l'operador de redirecció d'entrada (<).

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

També podeu emmagatzemar el nom del fitxer a una variable i passar-lo a través d'un operador de redirecció.

FILENAME="/etc/passwd"

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

També podeu passar noms de fitxer com a argument al vostre script.

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

Separador de camps intern

Podeu treballar amb diferents tipus de formats de fitxer (CSV, TXT, JSON) i és possible que vulgueu dividir el contingut del fitxer segons un delimitador personalitzat. En aquest cas, podeu utilitzar \Separador de camps interns (IFS) per dividir el contingut del fitxer i emmagatzemar-lo en variables.

Deixa'm demostrar com funciona. Mireu el fitxer /etc/passwd que té dos punts (:) com a delimitador. Ara podeu dividir cada paraula d'una línia i emmagatzemar-la en una variable separada.

A l'exemple següent, estic dividint el fitxer /etc/passwd amb dos punts com a separador i emmagatzemant cada divisió en diferents variables.

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

Vaig mostrar només una línia dividida a la captura de pantalla anterior tenint en compte la mida de la captura de pantalla.

Línies buides a Linux

Les línies buides no s'ignoren quan recorreu el contingut del fitxer. Per demostrar-ho, he creat un fitxer de mostra amb el contingut següent. Hi ha 4 línies i poques línies buides, espai en blanc inicial, espai en blanc final, caràcters de tabulació a la línia 2 i alguns caràcters d'escapada (\n i \t).

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

Vegeu el resultat, la línia en blanc no s'ignora. A més, una cosa interessant a tenir en compte és com es retallen els espais en blanc mitjançant l'ordre de lectura. Una manera senzilla d'ignorar les línies en blanc en llegir el contingut del fitxer és utilitzar l'operador de prova amb el senyalador -z que verifica si la longitud de la cadena és zero. Ara repetim el mateix exemple però aquesta vegada amb un operador de prova.

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

Ara, des de la sortida, podeu veure que les línies buides s'ignoren.

Personatges d'escapament

Els caràcters d'escapada com \n, \t, \c no s'imprimiran en llegir un fitxer. Per demostrar-ho, estic fent servir el mateix fitxer de mostra que té pocs caràcters d'escapada.

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

Podeu veure a la sortida que els caràcters d'escapament han perdut el seu significat i només s'imprimeixen n i t en comptes de \n i \t. Podeu utilitzar -r per evitar la interpretació de la barra invertida.

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

Això és tot per aquest article. Ens agradaria saber de vosaltres si hi ha comentaris o consells. Els vostres comentaris són els que ens ajuden a crear un millor contingut. Segueix llegint i segueix donant suport.