při psaní Bash skriptů se někdy ocitnete v situacích, kdy potřebujete číst řádek po řádku. Například můžete mít textový soubor obsahující data, která by měla být zpracována skriptem.
v tomto tutoriálu budeme diskutovat o tom, jak číst řádek souboru podle řádku v Bash.,
Čtení Souboru řádek Po Řádku Syntaxe #
nejvíce obecné syntaxe pro čtení souboru řádek po řádku je následující:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
nebo ekvivalent single-line verze:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
Jak to funguje?
vstupní soubor (input_file
) je název souboru přesměrovaného na while loop. Příkaz read
zpracovává řádek souboru podle řádku a přiřazuje každý řádek proměnné line
. Jakmile jsou všechny řádky zpracovány, zatímco smyčka končí.,
ve výchozím nastavení read
příkaz interpretuje zpětné lomítko jako řídicí znak a odstraní všechny úvodní a koncové bílé mezery, což někdy může způsobit neočekávané chování. Zakázat zpětné lomítko útěku, jsme vyvolání příkazu -r
možnost, a zakázat ořezávání, vnitřní oddělovač pole (IFS
) je zrušeno.
používáme místo echo
, aby byl kód přenosnější a aby se zabránilo nežádoucímu chování., Pokud například řádek obsahuje hodnoty jako „-e“, bude s ním zacházeno jako s možností echo.
čtení řádku souboru podle příkladů řádků #
podívejme se na následující příklad. Předpokládejme, že máme soubor jménem distros.txt
obsahující seznam některých z nejpopulárnějších Linuxových distribucí, a jejich balení manažeři odděleny čárkou (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
čtení souboru řádek po řádku, měli byste spustit následující kód v terminálu:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
kód načte soubor po řádku, přiřadí každý řádek do proměnné, a vytiskne jej. V podstatě byste viděli stejný výstup,jako byste zobrazili obsah souboru pomocí příkazu cat
.
Co když chcete tisknout pouze distribuce, které používají apt?, Jeden způsob, jak by se pomocí if
prohlášení a zkontrolujte, zda řádek obsahuje apt podřetězec :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
Při čtení souboru řádek po řádku, můžete také projít více než jedné proměnné na read
příkaz, která bude rozdělit řádek na pole založené na IFS
. První pole je přiřazeno první proměnné, druhé druhé druhé proměnné a tak dále. Pokud existuje více polí než proměnných, zbývající pole jsou přiřazena Poslední proměnné.,
V následujícím příkladu jsme nastavili IFS
čárkou (,
) a projít dvě proměnné distro
pm
read
příkaz.,všechno od začátku řádku až do první čárka bude přiřazen k první proměnné (distro
), a zbytek řádku bude přiřazena k druhé proměnné (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
Alternativní Čtení Souboru Metod #
Použití Proces Substituce #
Proces substituce je funkce, která umožňuje použít výstup z příkazu souboru:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
Použití Zde Řetězec #
Zde Řetězec je varianta Tady dokumentu ., Řetězec (cat input_file )
udržuje nové řádky:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
Použití deskriptor Souboru #
můžete také poskytovat vstup do smyčky pomocí deskriptoru souboru:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
Při práci s file deskriptory , použít číslo mezi 4 a 9, aby se zabránilo konfliktu s shell vnitřní souboru deskriptorů.
závěr #
v Bash můžeme číst řádek po řádku souboru pomocí smyčky while a příkazu read
.
Napsat komentář