Při psaní Bash skriptů se občas dostanete do situací, kdy potřebujete číst soubor řádek po řádku. Můžete mít například textový soubor obsahující data, která by měla být skriptem zpracována.
V tomto tutoriálu probereme, jak číst soubor řádek po řádku v Bash.
Čtení souboru řádek po řádku syntaxe #
Nejobecnější 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 ekvivalentní jednořádková 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 do cyklu while. read
příkaz zpracuje soubor řádek po řádku a každý řádek přiřadí k line
variabilní. Jakmile jsou všechny řádky zpracovány, smyčka while skončí.
Ve výchozím nastavení read
příkaz interpretuje zpětné lomítko jako znak escape a odstraňuje všechny mezery na začátku a na konci, což může někdy způsobit neočekávané chování. Chcete-li zakázat escapování zpětného lomítka, vyvoláme příkaz s -r
a chcete-li zakázat oříznutí, interní oddělovač polí (IFS
) je vymazáno.
Používáme [printf
] namísto echo
aby byl kód lépe přenosný a aby se zabránilo nežádoucímu chování. Pokud například řádek obsahuje hodnoty jako „-e“, bude to považováno za možnost echo.
Příklady čtení souboru řádek po řádku #
Podívejme se na následující příklad. Předpokládejme, že máme soubor s názvem distros.txt
obsahující seznam některých nejoblíbenějších distribucí Linuxu a jejich správců balíčků oddělených čárkou (,
):
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
Chcete-li číst soubor řádek po řádku, spustili byste ve svém terminálu následující kód:
while IFS= read -r line; do
printf '%s\n' "$line"
done < distros.txt
Kód čte soubor po řádku, každý řádek přiřadí proměnné a vytiskne ji. V podstatě byste viděli stejný výstup, jako kdybyste zobrazili obsah souboru pomocí cat
příkaz.
Co když chcete tisknout pouze distribuce, které používají apt? Jedním ze způsobů by bylo použití if
a zkontrolujte, zda řádek obsahuje podřetězec apt:
while IFS= read -r line; do
if [[ "$line" == *"apt"* ]]; then
printf '%s\n' "$line"
fi
done < distros.txt
Ubuntu,apt
Debian,apt
Při čtení souboru řádek po řádku můžete také předat více než jednu proměnnou do read
příkaz, který rozdělí řádek na pole na základě IFS
. První pole je přiřazeno první proměnné, druhé druhé proměnné atd. 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 nastavíme IFS
na čárku (,
) a předejte dvě proměnné distro
a pm
do read
příkaz. Vše od začátku řádku až po první čárku bude přiřazeno první proměnné (distro
) a zbytek řádku bude přiřazen 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 Ubuntu
apt is the package manager for Debian
yum is the package manager for CentOS
pacman is the package manager for Arch Linux
dnf is the package manager for Fedora
Alternativní metody čtení souborů #
Použití substituce procesu #
Substituce procesu je funkce, která vám umožňuje použít výstup z příkazu jako soubor:
while IFS= read -r line; do
printf '%s\n' "$line"
done < <(cat input_file )
Použití řetězce Here #
Here String je variantou dokumentu Here. Řetězec (cat input_file )
zachovává nové řádky:
while IFS= read -r line; do
printf '%s\n' "$line"
done <<< $(cat input_file )
Použití deskriptoru souboru #
Vstup do smyčky můžete také poskytnout pomocí deskriptoru souboru:
while IFS= read -r -u9 line; do
printf '%s\n' "$line"
done 9< input_file
Při práci s deskriptory souborů používejte číslo mezi 4 a 9, abyste se vyhnuli konfliktu s interními deskriptory souborů shellu.
Závěr č.
V Bash můžeme číst soubor řádek po řádku pomocí cyklu while a read
příkaz.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.