När du skriver Bash-skript befinner du dig ibland i situationer där du behöver läsa en filrad för rad. Du kan till exempel ha en textfil som innehåller data som ska behandlas av skriptet.
i den här guiden kommer vi att diskutera hur man läser en fil rad för rad i Bash.,
läsa en fil rad för rad Syntax #
den vanligaste syntaxen för att läsa en fil rad för rad är följande:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
eller motsvarande enradig version:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
hur fungerar det?
indatafilen (input_file
) är namnet på filen som omdirigeras till While loop. Kommandotread
behandlar filraden för rad och tilldelar varje rad till variabeln line
. När alla linjer bearbetas, medan slingan avslutas.,
som standard tolkar kommandotread
backslash som ett escape-tecken och tar bort alla ledande och efterföljande vita utrymmen, vilket ibland kan orsaka oväntat beteende. Om du vill inaktivera backslash-flykten åberopar vi kommandot med alternativet-r
och för att inaktivera trimningen rensas den interna fältavskiljaren (IFS
).
vi använder istället för echo
för att göra koden mer bärbar och för att undvika oönskade beteenden., Till exempel, om raden innehåller värden som ”-e”, kommer den att behandlas som ett echo-alternativ.
läsa en Filrad efter rad exempel #
Låt oss ta en titt på följande exempel. Antag att vi har en fil som heter distros.txt
som innehåller en lista över några av de mest populära Linux-distributionerna och deras pakethanterare separerade med kommatecken (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
om du vill läsa filraden efter rad kör du följande kod i terminalen:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
koden läser filen efter rad, tilldelar varje rad till en variabel och skriver ut den. I grund och botten skulle du se samma utmatning som om du skulle visa filinnehållet med kommandot cat
.
vad händer om du bara vill skriva ut distributionerna som använder apt?, Ett sätt skulle vara att använda if
– satsen och kontrollera om linjen innehåller apt-substringen :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
När du läser en filrad för rad kan du också skicka mer än en variabel till kommandot read
, som kommer att dela upp raden i rad i fält baserade på IFS
. Det första fältet tilldelas den första variabeln, den andra till den andra variabeln och så vidare. Om det finns fler fält än variabler tilldelas de kvarvarande fälten till den sista variabeln.,
i följande exempel anger viIFS
till ett kommatecken (,
) och skickar två variablerdistro
ochpm
till kommandotread
.,allt från början av raden tills det första kommatecken kommer att tilldelas den första variabeln (distro
), och resten av raden kommer att tilldelas den andra variabeln (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 filläsning en process substitution #
process substitution är en funktion som låter dig använda utdata från kommandot som en fil:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
använda en här sträng #
här sträng är en variant av här dokument ., Strängen (cat input_file )
håller nyraderna:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
använda fildeskriptor #
Du kan också ange inmatningen till slingan med hjälp av en fildeskriptor:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
När du arbetar med fildeskriptorer , kan du använda en fildeskriptor:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
När du Använd ett nummer mellan 4 och 9 för att undvika konflikt med Shell interna fil deskriptorer.
slutsats #
i Bash kan vi läsa en fillinje för rad med en while loop och kommandotread
.
Lämna ett svar