Ulike måter å lese fil i Bash-skript ved å bruke While Loop


Denne artikkelen handler om hvordan du leser filer i bash-skript ved å bruke en while loop. Å lese en fil er en vanlig operasjon i programmering. Du bør være kjent med ulike metoder og hvilken metode som er mer effektiv å bruke. I bash kan en enkelt oppgave oppnås på mange måter, men det er alltid en optimal måte å få oppgaven gjort på, og vi bør følge den.

Før du ser hvordan du leser filinnhold ved å bruke while loop, en rask primer om hvordan while loop fungerer. Mens loop evaluerer en betingelse og itererer over et gitt sett med koder når betingelsen er sann.

while [ CONDITION ]
do
    code block
done

La oss bryte ned while loop-syntaksen.

  • while loop bør starte med et while-søkeord etterfulgt av en betingelse.
  • En betingelse skal være vedlagt [ ] eller [[ ]]. Betingelsen skal alltid returnere sann for at løkken skal utføres.
  • Selve kodeblokken vil bli plassert mellom gjør og ferdig.
NUMBER=0

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

Dette er et veldig enkelt eksempel, der løkken kjøres til NUMBER ikke er større enn 10 og skriver ut ekkosetningen.

Sammen med mens bruker vi kommandoen les for å lese innholdet i en fil linje for linje. Nedenfor er syntaksen for hvordan while og read-kommandoer kombineres. Nå er det forskjellige måter å sende filen som input, og vi vil se dem alle.

SYNTAX
while read VARIABLE
do
    code
done

Piping i Linux

Normalt vil vi bruke cat-kommandoen for å se innholdet i filen fra terminalen. Vi vil også overføre utdataene fra cat-kommandoen til andre kommandoer som grep, sort, etc.

På samme måte vil vi bruke cat-kommandoen her for å lese innholdet i filen og overføre den til en while-løkke. For demonstrasjon bruker jeg /etc/passwd-filen, men det er ikke tilrådelig å rote med denne filen, så ta en sikkerhetskopi av denne filen og lek med den hvis du ønsker det.

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

La oss bryte ned hva som vil skje når koden ovenfor sendes inn.

  • cat /etc/passwd vil lese innholdet i filen og sende det som input gjennom røret.
  • read-kommandoen leser hver linje som sendes som input fra cat-kommandoen og lagrer den i LREAD-variabelen.
  • Kommandoen les vil lese filinnholdet til EOL tolkes.

Du kan også bruke andre kommandoer som head, tail og pipe it to while loop.

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

Input Redirection i Linux

Vi kan omdirigere innholdet i filen til while loop ved å bruke Input-omdirigeringsoperatøren (<).

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

Du kan også lagre filnavnet til en variabel og sende det gjennom en omdirigeringsoperatør.

FILENAME="/etc/passwd"

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

Du kan også sende filnavn som et argument til skriptet ditt.

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

Intern feltseparator

Du kan arbeide med forskjellige typer filformater (CSV, TXT, JSON), og det kan være lurt å dele innholdet i filen basert på en egendefinert skilletegn. I dette tilfellet kan du bruke «Intern feltseparator (IFS)» for å dele innholdet i filen og lagre det i variabler.

La meg demonstrere hvordan det fungerer. Ta en titt på /etc/passwd-filen som har et kolon (:) som skilletegn. Du kan nå dele hvert ord fra en linje og lagre det i en separat variabel.

I eksemplet nedenfor deler jeg /etc/passwd-filen med et kolon som skilletegn og lagrer hver splitt i forskjellige variabler.

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

Jeg viste bare én linjedelt i skjermbildet ovenfor med tanke på størrelsen på skjermbildet.

Tomme linjer i Linux

Tomme linjer ignoreres ikke når du sløyfer gjennom filinnholdet. For å demonstrere dette har jeg laget en eksempelfil med innholdet nedenfor. Det er 4 linjer og få tomme linjer, ledende mellomrom, etterfølgende mellomrom, tabulatortegn i linje 2, og noen escape-tegn (\n og \t).

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

Se resultatet, blank linje ignoreres ikke. En interessant ting å merke seg er også hvordan hvite mellomrom trimmes av les-kommandoen. En enkel måte å ignorere tomme linjer når du leser filinnholdet er å bruke testoperatoren med -z-flagget som sjekker om strenglengden er null. La oss nå gjenta det samme eksemplet, men denne gangen med en testoperatør.

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

Nå fra utgangen kan du se at tomme linjer blir ignorert.

Escape-karakterer

Escape-tegn som \n, \t, \c vil ikke bli skrevet ut når du leser en fil. For å demonstrere dette bruker jeg den samme eksempelfilen som har få escape-tegn.

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

Du kan se fra utdataene at escape-tegn har mistet sin betydning og bare n og t skrives ut i stedet for \n og \t . Du kan bruke -r for å forhindre tolkning av skråstrek.

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

Det er det for denne artikkelen. Vi vil gjerne høre fra deg hvis det er noen tilbakemeldinger eller tips. Tilbakemeldingen din er det som hjelper oss å lage bedre innhold. Fortsett å lese og fortsett å støtte.