pisząc skrypty Bash, czasami znajdziesz się w sytuacjach, w których musisz przeczytać plik linia po linii. Na przykład możesz mieć plik tekstowy zawierający dane, które powinny być przetwarzane przez skrypt.

w tym samouczku omówimy, jak czytać plik linia po linii w Bash.,

odczyt składni pliku linia po linii #

najbardziej ogólna składnia do odczytu pliku linia po linii jest następująca:

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

lub równoważna wersja jednowierszowa:

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

jak to działa?

plik wejściowy (input_file) jest nazwą pliku przekierowanego do pętli while. Polecenieread przetwarza plik linia po linii, przypisując każdą linię do zmiennejline. Po przetworzeniu wszystkich linii pętla while kończy się.,

domyślnie polecenieread interpretuje ukośnik wsteczny jako znak specjalny i usuwa wszystkie początkowe i końcowe białe spacje, które czasami mogą powodować nieoczekiwane zachowanie. Aby wyłączyć usuwanie ukośników wstecznych, wywołujemy polecenie z opcją -r, a aby wyłączyć przycinanie, wewnętrzny separator pól (IFS) jest wyczyszczony.

używamy zamiastecho aby uczynić kod bardziej przenośnym i uniknąć niechcianych zachowań., Na przykład, jeśli linia zawiera wartości takie jak „- e”, będzie traktowana jako opcja echo.

odczyt pliku linia po linii przykłady #

przyjrzyjmy się poniższemu przykładowi. Załóżmy, że mamy plik o nazwie distros.txtzawierający listę najpopularniejszych dystrybucji Linuksa i ich menedżerów pakietów oddzielonych przecinkiem (,):

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

aby odczytać plik linia po linii, należy uruchomić następujący kod w terminalu:

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

kod odczytuje plik po linii, przypisuje każdą linię do zmiennej i drukuje ją. Zasadniczo, zobaczysz to samo wyjście, jak gdyby Wyświetlono zawartość pliku za pomocą polecenia cat.

Co zrobić, jeśli chcesz wydrukować tylko dystrybucje, które używają apt?, Jednym ze sposobów jest użycie instrukcji if I Sprawdzenie, czy linia zawiera podłańcuch apt :

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

podczas czytania pliku linia po linii Możesz również przekazać więcej niż jedną zmienną do read polecenie, które podzieli linię na pola na podstawie IFS. Pierwsze pole jest przypisane do pierwszej zmiennej, drugie do drugiej zmiennej i tak dalej. Jeśli jest więcej pól niż zmiennych, pozostałe pola są przypisane do ostatniej zmiennej.,

w poniższym przykładzie ustawiamy IFS na przecinek (,) I przekazujemy dwie zmienne distro I pm do read polecenie.,erything od początku linii do pierwszego przecinka zostanie przypisany do pierwszej zmiennej (distro), a reszta linii zostanie przypisana do drugiej zmiennej (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

alternatywne metody odczytu plików #

użycie substytucji procesu #

podstawienie procesu jest funkcją, która pozwala na użycie wyjścia z polecenia jako pliku:

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

użycie ciągu here #

tutaj ciąg jest wariantem here dokument ., Łańcuch (cat input_file ) zachowuje nowe linie:

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

używając deskryptora pliku #

Możesz również podać wejście do pętli za pomocą deskryptora pliku:

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

podczas pracy z deskryptorami plików , użyj liczby od 4 do 9, aby uniknąć konfliktu z wewnętrznymi deskryptorami plików powłoki.

podsumowanie #

w Bash możemy odczytać plik linia po linii za pomocą pętli while I polecenia read.