Når du skriver Bash-skript, vil du noen ganger finne deg selv i situasjoner hvor du trenger å lese en fil, linje for linje. For eksempel kan du ha en tekstfil som inneholder data som bør bli behandlet av skriptet.

I denne opplæringen vil vi diskutere hvordan å lese en fil linje for linje i Bash.,

Leser en Fil linje for Linje Syntaks #

Den mest generelle syntaksen for å lese en fil linje-for-linje er som følger:

while IFS= read -r line; do printf '%s\n' "$line"done < input_file

eller tilsvarende single-line versjonen:

while IFS= read -r line; do printf '%s\n' "$line"; done < input_file

Hvordan fungerer det?

input file (input_file) er navnet på filen omdirigert til mens loop. read – kommandoen behandler fil linje for linje, tildele hver linje til line variabel. Når alle linjer er behandlet, mens loop opphører.,

standard read kommando tolker omvendt skråstrek som en escape-tegnet og fjerner alle ledende og etterfølgende mellomrom, som noen ganger kan føre til uventet oppførsel. For å deaktivere omvendt skråstrek rømmer, kan vi bruke kommandoen med -r valg, og til å deaktivere trimming, den interne feltet skilletegn (IFS) er fjernet.

Vi bruker i stedet for echo for å gjøre koden mer portable, og for å unngå uønsket atferd., For eksempel, hvis linjen inneholder verdier som «-e», vil den bli behandlet som et ekko alternativ.

Leser en Fil linje for Linje Eksempler #

La oss ta en titt på følgende eksempel. Anta at vi har en fil som heter distros.txt inneholder en liste over noen av de mest populære Linux-distribusjoner, og deres pakken ledere atskilt med komma (,):

distroer.,txt
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf

for Å lese filen linje for linje, kan du kjøre følgende kode i din terminal:

while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt

– koden leser filen ved linje, tildeler hver linje til en variabel, og skriver det ut. I utgangspunktet, du vil se den samme effekt som hvis du vil vise filen du innhold ved hjelp av cat – kommandoen.

Hva hvis du vil skrive ut bare det distribusjoner som bruker apt?, En måte ville være å bruke if uttalelse og sjekk hvis feltet inneholder apt delstreng :

while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt

Når du leser en fil linje for linje, kan du også sende mer enn én variabel til read – kommandoen, som vil delt linje i felt basert på IFS. Det første feltet er tilordnet til den første variabelen, den andre på den andre variabelen, og så videre. Hvis det er flere felt enn variabler, leftover felt som er tilordnet til den siste variabelen.,

I det følgende eksemplet, vi set IFS for å et komma (,) og passerer to variabler distro og pm til read – kommandoen.,erything fra begynnelsen av linjen til den første komma vil bli tildelt den første variabelen (distro), og resten av linjen vil bli tildelt til andre variable (pm):

while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora

Alternativ Fil Leser Metoder #

ved Hjelp av en Prosess Substitusjon #

Prosessen substitusjon er en funksjon som tillater deg å bruke output fra kommandoen som en fil:

while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )

ved Hjelp av a Her String #

Her String er en variant av Her dokumentet ., Strengen (cat input_file ) holder newlines:

while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )

ved Hjelp av Filen descriptor #

Du kan også gi innspill til løkken ved hjelp av en fil beskrivelse:

while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file

Når du arbeider med en fil beskrivelsene , bruke et nummer som er mellom 4 og 9 for å unngå konflikt med shell interne file beskrivelsene.

Konklusjon #

I Bash, kan vi lese en fil linje-for-linje ved hjelp av en while-løkke og read – kommandoen.