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.