Eri tapoja lukea tiedostoa Bash-skriptissä Silmukan avulla
Tämä artikkeli käsittelee bash-skriptien tiedostojen lukemista while-silmukan avulla. Tiedoston lukeminen on yleinen ohjelmointitoiminto. Sinun tulee tuntea erilaiset menetelmät ja tuntea, mikä menetelmä on tehokkaampi käyttää. Bashissa yksi tehtävä voidaan saavuttaa monella tapaa, mutta aina on optimaalinen tapa saada tehtävä tehtyä ja meidän tulee noudattaa sitä.
Ennen kuin opit lukemaan tiedoston sisältöä while loop -toiminnolla, lyhyt aluke siitä, miten while-silmukka toimii. While-silmukka arvioi ehdon ja toistaa tietyn koodijoukon, kun ehto on tosi.
while [ CONDITION ]
do
code block
done
Erotetaan while loop -syntaksi.
- while loop -avainsanan tulee alkaa while-avainsanalla, jota seuraa ehto.
- Ehto tulee olla [ ] tai [[ ]] sisällä. Suoritettavan silmukan ehdon tulee aina palauttaa tosi.
- Varsinainen koodilohko sijoitetaan väliin do ja done.
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
echo " Welcome ${NUMBER} times "
(( NUMBER++ ))
done
Tämä on hyvin yksinkertainen esimerkki, jossa silmukka suoritetaan, kunnes NUMBER on enintään 10 ja tulostaa kaikulausekkeen.
while-komennon lisäksi käytämme read-komentoa tiedoston sisällön lukemiseen rivi riviltä. Alla on syntaksi siitä, kuinka while- ja read-komennot yhdistetään. Nyt on olemassa erilaisia tapoja siirtää tiedosto syötteenä ja näemme ne kaikki.
SYNTAX
while read VARIABLE
do
code
done
Putket Linuxissa
Normaalisti käytämme cat-komentoa tarkastellaksemme tiedoston sisältöä päätteestä. Liitämme myös cat-komennon tulosteen muihin komentoihin, kuten grep, sort jne.
Vastaavasti käytämme tässä cat-komentoa tiedoston sisällön lukemiseen ja sen ohjaamiseen while-silmukkaan. Esittelyä varten käytän /etc/passwd-tiedostoa, mutta tämän tiedoston kanssa ei ole suositeltavaa sotkea, joten ota tästä tiedostosta varmuuskopio ja pelaa sillä halutessasi.
cat /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Selvitetään, mitä tapahtuu, kun yllä oleva koodi lähetetään.
- cat /etc/passwd lukee tiedoston sisällön ja välittää sen syötteenä putken kautta.
- read-komento lukee jokaisen cat-komennosta syötetyn rivin ja tallentaa sen LREAD-muuttujaan.
- read-komento lukee tiedoston sisällön, kunnes EOL on tulkittu.
Voit myös käyttää muita komentoja, kuten head, tail ja pipe it to while-silmukkaan.
head -n 5 /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Tulon uudelleenohjaus Linuxissa
Voimme ohjata tiedoston sisällön uudelleen kohtaan while loop käyttämällä Input-uudelleenohjausoperaattoria (<)
.
while read LREAD
do
echo ${LREAD}
done < /etc/passwd | head -n 5
Voit myös tallentaa tiedostonimen muuttujaan ja välittää sen uudelleenohjausoperaattorin kautta.
FILENAME="/etc/passwd"
while read LREAD
do
echo ${LREAD}
done < ${FILENAME}
Voit myös välittää tiedostonimiä komentosarjan argumentteina.
while read LREAD
do
echo ${LREAD}
done < $1 | head -n 5
Sisäinen kenttäerotin
Voit käyttää erityyppisiä tiedostomuotoja (CSV, TXT, JSON) ja haluat ehkä jakaa tiedoston sisällön mukautettu erotin. Tässä tapauksessa voit jakaa tiedoston sisällön ja tallentaa sen muuttujiin Sisäisen kentän erottimen (IFS) avulla.
Anna minun näyttää, kuinka se toimii. Katso /etc/passwd-tiedosto, jonka erottimena on kaksoispiste (:)
. Voit nyt jakaa jokaisen sanan riviltä ja tallentaa sen erilliseen muuttujaan.
Alla olevassa esimerkissä jaan /etc/passwd-tiedoston kaksoispisteellä erottimena ja tallennan kunkin jaon eri muuttujiksi.
while IFS=":" read A B C D E F G
do
echo ${A}
echo ${B}
echo ${C}
echo ${D}
echo ${E}
echo ${F}
echo ${G}
done < /etc/passwd
Näytin vain yhden rivin jaetun yllä olevassa kuvakaappauksessa ottaen huomioon kuvakaappauksen koon.
Tyhjät rivit Linuxissa
Tyhjiä rivejä ei huomioida, kun kierrät tiedoston sisällön. Tämän osoittamiseksi olen luonut alla olevan sisällön esimerkkitiedoston. Siinä on 4 riviä ja muutama tyhjä rivi, edessä välilyönti, lopussa välilyönti, rivillä 2 sarkainmerkkejä ja joitain erotusmerkkejä (\n ja \t).
while read LREAD
do
echo ${LREAD}
done < testfile
Katso tulos, tyhjää riviä ei huomioida. Mielenkiintoinen asia on myös se, kuinka välilyönnit leikataan read-komennolla. Yksinkertainen tapa jättää tyhjät rivit huomioimatta tiedoston sisältöä luettaessa on käyttää testioperaattoria -z
-lipulla, joka tarkistaa, onko merkkijonon pituus nolla. Toistetaan nyt sama esimerkki, mutta tällä kertaa testioperaattorilla.
while read LREAD
do
if [[ ! -z $LREAD ]]
then
echo ${LREAD}
fi
done < testfile
Nyt voit nähdä lähdöstä tyhjät rivit ohitetaan.
Pakohahmot
Esc-merkkejä, kuten \n
, \t
, \c
, ei tulosteta tiedostoa luettaessa. Tämän havainnollistamiseksi käytän samaa mallitiedostoa, jossa on vähän erotusmerkkejä.
while read LREAD
do
echo ${LREAD}
done < testfile
Näet tulosteesta, että estomerkit ovat menettäneet merkityksensä ja vain n ja t tulostetaan \n
ja \t sijaan.
. Voit estää kenoviivatulkinnan käyttämällä -r
-komentoa.
while read -r LREAD
do
echo ${LREAD}
done < testfile
Siinä se tälle artikkelille. Otamme mielellämme vastaan, jos sinulla on palautetta tai vinkkejä. Palautteesi auttaa meitä luomaan parempaa sisältöä. Jatka lukemista ja tue.