írásakor Bash szkriptek, akkor néha találja magát olyan helyzetekben, ahol meg kell olvasni a fájl sort soronként. Például lehet, hogy van egy szöveges fájl, amely adatokat tartalmaz, amelyeket a szkriptnek kell feldolgoznia.
ebben az oktatóanyagban megvitatjuk, hogyan lehet egy fájlvonalat soronként olvasni a Bash-ben.,
Fájlsor olvasása soronkénti szintaxis szerint #
a fájl soronkénti olvasásának legáltalánosabb szintaxisa a következő:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
vagy az egyenértékű egysoros verzió:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
hogy működik ?
a bemeneti fájl (input_file
) a while hurokba átirányított fájl neve. Aread
parancs a fájlvonalat soronként dolgozza fel, minden sort hozzárendelve aline
változóhoz. Az összes sor feldolgozása után a while hurok megszűnik.,
alapértelmezés szerint a read
parancs a backslash-et escape karakterként értelmezi, és eltávolítja az összes vezető-és hátsó fehér teret, ami néha váratlan viselkedést okozhat. A backslash escaping letiltásához a -r
parancsra hivatkozunk, a vágás letiltásához pedig a belső mező elválasztó (IFS
) törlődik.
a echo
helyett a kód hordozhatóbbá tétele és a nem kívánt viselkedés elkerülése érdekében használjuk., Például, ha a sor olyan értékeket tartalmaz, mint a”- e”, akkor echo opcióként kell kezelni.
Fájlsor olvasása soronként példák #
vessünk egy pillantást a következő példára. Tegyük fel, hogy van egy distros.txt
nevű fájlunk, amely tartalmazza a legnépszerűbb Linux disztribúciók listáját, valamint csomagkezelőiket vesszővel elválasztva (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
a fájl soronkénti olvasásához a következő kódot futtatná a terminálon:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
a kód soronként olvassa a fájlt, minden sort egy változóhoz rendel, majd kinyomtatja. Alapvetően ugyanazt a kimenetet látja, mintha a fájl tartalmát a cat
paranccsal jelenítené meg.
mi van, ha csak az apt-t használó disztribúciókat szeretné kinyomtatni?, Ennek egyik módja, hogy használja a if
nyilatkozatot, továbbá ellenőrizze a vonalat tartalmaz, az apt substring :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
olvasva a fájl soronként, akkor is át több, mint egy változó, hogy a read
parancs, ami szét a vonalat mezők alapján IFS
. Az első mező az első változóhoz van hozzárendelve, a második a második változóhoz stb. Ha több mező van, mint változó, a maradék mezők az utolsó változóhoz vannak hozzárendelve.,
a következő példában aIFS
értéket vesszőre állítottuk (,
), és két változótdistro
éspm
read
parancs.,erything a kezdetektől a határt, addig, amíg az első vessző lesz rendelve az első változó (distro
), a többi vonal lesz rendelve a második változó (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
Alternatív Fájl Olvasási Módszerek #
a Folyamat Helyettesítő #
a Folyamat helyettesítő olyan funkció, amely lehetővé teszi, hogy a kimenet a parancs egy fájl:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
Használata Itt String #
Itt a Karakterlánc egy változata Itt dokumentum ., A string (cat input_file )
tartja a újsor:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
A Fájl leíró #
Azt is biztosítani, hogy a bemenő, hogy a hurok segítségével egy fájl leíró:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
Amikor a dolgozó fájl leíró , használja a szám között 4 9 konfliktus elkerülése a héj belső fájl leíró.
következtetés #
a Bash-ben egy fájlsor-Sort olvashatunk egy while loop és a read
parancs segítségével.
Vélemény, hozzászólás?