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.