Kun kirjoitat Bash skriptejä, voit joskus löytää itsesi tilanteissa, joissa sinun täytyy lukea tiedostoa rivi kerrallaan. Sinulla voi olla esimerkiksi tekstitiedosto, joka sisältää tietoja, jotka pitäisi käsitellä skriptin avulla.
tässä opetusohjelmassa keskustellaan siitä, miten Bashissa luetaan tiedostolinja riviltä.,
lukee Tiedoston Rivi riviltä Syntaksi #
kaikkein yleinen syntaksi tiedoston lukeminen line-by-line on seuraava:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
tai vastaavat yhden-line-versio:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
Miten se toimii?
input file (input_file
) on tiedoston nimi ohjataan while-silmukka. read
komento prosesseja tiedoston rivi kerrallaan, antamalla kullekin rivi line
muuttuja. Kun kaikki linjat on käsitelty, kun taas silmukka päättyy.,
oletuksena read
komento tulkitsee kenoviiva kuten escape-merkki ja poistaa kaikki johtava ja perään välilyöntejä, joka joskus voi aiheuttaa odottamatonta toimintaa. Poistaa kenoviiva paeta, olemme vetoamalla komento, jossa -r
vaihtoehto, ja poistaa leikkaus, sisäinen kenttä erotin (IFS
) on selvitetty.
käytämme echo
sijasta koodia kannettavana ja välttääksemme ei-toivottuja käyttäytymismalleja., Jos rivissä on esimerkiksi arvoja ”-e”, sitä käsitellään kaikuvaihtoehtona.
lukee Tiedoston Rivi riviltä Esimerkkejä #
otetaanpa katso seuraava esimerkki. Oletetaan, että meillä on tiedosto nimeltä distros.txt
sisältää listan joitakin suosituimmista Linux-jakeluista, ja niiden pakkauksessa johtajat erotetaan pilkulla (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
luetaan tiedostoa rivi kerrallaan, suorita seuraava koodi in your terminaali:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
koodi lukee tiedoston rivi, määrittää kunkin rivin muuttujaan, ja tulostaa se. Periaatteessa, näkisit saman ulostulon kuin jos näyttäisit tiedoston sisällön käyttäen cat
– komentoa.
Mitä jos haluat tulostaa vain ositteita käyttävät jakelut?, Yksi tapa olisi käyttää if
selvitys ja tarkistaa, jos rivi sisältää apt substring :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
Kun lukee tiedoston rivi riviltä, voit myös siirtää enemmän kuin yksi muuttuja read
komento, jotka jakavat rivin kenttiin perustuu IFS
. Ensimmäinen kenttä osoitetaan ensimmäiseen muuttujaan, toinen toiseen muuttujaan ja niin edelleen. Jos kenttiä on enemmän kuin muuttujia, ylijääneet kentät osoitetaan viimeiseen muuttujaan.,
seuraavassa esimerkissä asetamme IFS
pilkun (,
) ja siirtää kaksi muuttujaa distro
ja pm
ja read
komento.,olen alusta linja, kunnes ensimmäinen pilkku on määritetty ensimmäisen muuttujan (distro
), ja loput linja osoitetaan toinen muuttuja (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
Vaihtoehto Tiedoston Lukemiseen Menetelmiä #
Käyttämällä Prosessin Korvaaminen #
Prosessi korvaaminen on ominaisuus, jonka avulla voit käyttää tuotosta komento tiedosto:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
Käyttämällä Täällä String #
Tässä Merkkijono on variantti Tässä asiakirjassa ., Merkkijono (cat input_file )
pitää rivinvaihto:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
Käyttämällä Tiedosto avainsana #
Voit myös antaa input-silmukka käyttäen tiedosto avainsana:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
Kun työskentelee tiedostokuvaajia , käytä numeroa välillä 4 ja 9 välttää ristiriidassa shell sisäisen tiedostokuvaajia.
Johtopäätös #
Bash, voimme lukea tiedostoa rivi kerrallaan while-silmukka ja read
komento.
Vastaa