Når du skriver Bash-scripts, vil du undertiden finde dig selv i situationer, hvor du har brug for at læse en fil linje for linje. For eksempel kan du have en tekstfil, der indeholder data, der skal behandles af scriptet.

i denne tutorial vil vi diskutere, hvordan man læser en fil linje for linje i Bash.,

Læse en Fil linje for Linje Syntaks #

Den mest generelle syntaks til at læse 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 version:

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

Hvordan virker det?

inputfilen (input_file) er navnet på den fil, der omdirigeres til whilehile-løkken. Kommandoen read behandler fillinjen for linjen og tildeler hver linje til variablen line. Når alle linjer er behandlet, ophører whilehile-sløjfen.,

som standard fortolker kommandoenread backslash som et escape-tegn og fjerner alle førende og efterfølgende hvide rum, som undertiden kan forårsage uventet opførsel. For at deaktivere backslash escaping påberåber vi kommandoen med indstillingen -r, og for at deaktivere trimningen ryddes den interne feltseparator (IFS).

Vi bruger i stedet for echo for at gøre koden mere bærbare, og for at undgå uønsket adfærd., For eksempel, hvis linjen indeholder værdier som “-e”, vil den blive behandlet som en echo-indstilling.

læsning af en fil linje for linje eksempler #

lad os tage et kig på følgende eksempel. Antag at vi har en fil med navnet distros.txt, der indeholder en liste af nogle af de mest populære Linux-distributioner, og deres pakke-managere adskilt med komma (,):

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

At læse den fil linje for linje, skal du køre følgende kode i din terminal:

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

– kode læser filen med line, tildeler hver linje til en variabel, og udskriver det. Grundlæggende vil du se det samme output, som om du vil vise filindholdet ved hjælp af kommandoen cat.

Hvad hvis du kun vil udskrive de distributioner, der bruger apt?, En måde kunne være at bruge if erklæring, og kontroller, om den linje, der indeholder apt substring :

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

Når du læser en fil linje for linje, kan du også gå mere end én variabel til read kommando, der vil splitte linjen i felter baseret på IFS. Det første felt er tildelt den første variabel, den anden til den anden variabel og så videre. Hvis der er flere felter end variabler, tildeles de resterende felter til den sidste variabel.,

I det følgende eksempel, vi har set IFS til et komma (,) og passere to variabler distro og pm til read kommandoen.,erything fra begyndelsen af linjen, indtil den første komma vil blive tildelt til den første variabel (distro), og resten af banen, vil blive tildelt den anden variabel (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 Læsning Metoder #

ved Hjælp af en Proces Substitution #

Processen substitution er en funktion, der giver dig mulighed for at bruge output fra kommandoen som en fil:

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

ved Hjælp af en Her String #

Her String er en variant af det Her dokument ., Strengen (cat input_file ) holder newlines:

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

Brug Fil-descriptor #

Du kan også give input til løkken ved hjælp af en file descriptor:

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

Når du arbejder med filen deskriptorer , skal du bruge et tal mellem 4 og 9 for at undgå konflikt med shell interne fil-deskriptorer.

konklusion #

i Bash kan vi læse en fil linje for linje ved hjælp af et stykke tid loop ogread kommando.