Erinevad viisid faili lugemiseks Bashi skriptis, kasutades silmusringi
See artikkel räägib sellest, kuidas lugeda bash-skriptides olevaid faile while-silmuse abil. Faili lugemine on programmeerimisel tavaline toiming. Peaksite tundma erinevaid meetodeid ja seda, millist meetodit on tõhusam kasutada. Bashis saab ühe ülesande saavutada mitmel viisil, kuid alati on optimaalne viis ülesande täitmiseks ja me peaksime seda järgima.
Enne kui näete, kuidas faili sisu lugeda while-i abil, saate kiire ülevaate selle kohta, kuidas loop töötab. Kuigi silmus hindab tingimust ja kordab antud koodide komplekti, kui tingimus on tõene.
while [ CONDITION ] do code block done
Lõhustagem silmuse süntaksit.
- while tsükkel peaks algama mõnda aega märksõnast, millele järgneb tingimus.
- Tingimus peaks olema lisatud [] või [[]]. Tingimus peaks aasa täitmiseks alati olema tõene.
- Tegelik koodiplokk pannakse tehte ja tehtud vahele.
NUMBER=0 while [[ $NUMBER -le 10 ]] do echo " Welcome ${NUMBER} times " (( NUMBER++ )) done
See on väga lihtne näide, kus tsükkel käivitub seni, kuni NUMBER pole suurem kui 10, ja prindib kajalause.
Samal ajal kui kasutame faili sisu ridade kaupa lugemiseks käsku read. Allpool on süntaks, kuidas käsud while ja read on ühendatud. Nüüd on faili sisendina edastamiseks erinevaid viise ja me näeme neid kõiki.
# SYNTAX while read VARIABLE do code done
Torustik Linuxis
Tavaliselt kasutame sortimist jne.
Samamoodi kasutame siin kassi käsku faili sisu lugemiseks ja selle ühendamiseks mõnda aega. Demonstreerimiseks kasutan/etc/passwd-faili, kuid selle failiga ei ole soovitatav segi ajada, nii et võtke sellest failist varukoopia ja mängige sellega, kui soovite.
cat /etc/passwd | while read LREAD do echo ${LREAD} done
Jaotame, mis juhtub ülaltoodud koodi esitamisel.
- cat/etc/passwd loeb faili sisu ja edastab selle toru sisendina.
- käsk read loeb iga rida, mis on sisestatud kassist käsu, ja salvestab selle muutujasse LREAD.
- käsk read loeb faili sisu seni, kuni EOL on tõlgendatud.
Võite kasutada ka muid käske, näiteks pea, saba ja toru see loopi.
head -n 5 /etc/passwd | while read LREAD do echo ${LREAD} done
Sisendi ümbersuunamine Linuxis
Saame faili sisu silmuseks ümber suunata, kasutades sisendi ümbersuunamisoperaatorit (<)
.
while read LREAD do echo ${LREAD} done < /etc/passwd | head -n 5
Samuti saate faili nime muutujale salvestada ja edastada ümbersuunamisoperaatori kaudu.
FILENAME="/etc/passwd" while read LREAD do echo ${LREAD} done < ${FILENAME}
Samuti saate oma skriptile argumendina edastada failinimed.
while read LREAD do echo ${LREAD} done < $1 | head -n 5
Sisemine välja eraldaja
Võite töötada erinevat tüüpi failivormingutega (CSV, TXT, JSON) ja soovite faili sisu kohandatud eraldaja alusel jagada. Sel juhul saate faili sisu jagada ja muutujatesse salvestamiseks kasutada jaotist „Internal field separator (IFS)”.
Las ma demonstreerin, kuidas see töötab. Vaadake faili/etc/passwd, mille eraldaja on koolon (:)
. Nüüd saate iga sõna reast jagada ja salvestada eraldi muutujasse.
Allpool toodud näites eraldan faili/etc/passwd eraldajana kooloniga ja salvestan iga jaotuse erinevateks muutujateks.
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
Ekraanipildi suurust arvestades kuvasin ülaltoodud ekraanipildil vaid ühe reajaotuse.
Tühjad read Linuxis
Tühja rida ei eirata, kui liigute faili sisu kaudu. Selle näitamiseks olen loonud allpool toodud sisuga näidisfaili. Seal on 4 rida ja vähe tühje ridu, mis viivad tühimikku, tühja tühiku lõppu, tabeli märke 2. real ja mõned põgenemismärgid (\ n ja\t).
while read LREAD do echo ${LREAD} done < testfile
Vaadake tulemust, tühja rida ei eirata. Huvitav on ka see, kuidas lugemiskäsu abil trimmitakse tühikuid. Lihtne viis tühjade ridade eiramiseks faili sisu lugemisel on kasutada testioperaatorit lipuga -z
, mis kontrollib, kas stringi pikkus on null. Kordame nüüd sama näidet, kuid seekord testioperaatoriga.
while read LREAD do if [[ ! -z $LREAD ]] then echo ${LREAD} fi done < testfile
Nüüd väljundist näete, et tühje ridu ignoreeritakse.
Põgenemistegelased
Faili lugemisel ei trükita põgenemismärke nagu \n
, \t
, \c
. Selle näitamiseks kasutan sama näidisfaili, millel on vähe põgenemismärke.
while read LREAD do echo ${LREAD} done < testfile
Väljundist näete, et põgenemismärgid on oma tähenduse kaotanud ja \n
ja \t
asemel trükitakse ainult n ja t. Tagasi kaldkriipsu tõlgendamise vältimiseks võite kasutada koodi -r
.
while read -r LREAD do echo ${LREAD} done < testfile
See on selle artikli jaoks. Meile meeldiks kuulda tagasisidet või näpunäiteid. Teie tagasiside on see, mis aitab meil paremat sisu luua. Jätkake lugemist ja jätkake toetamist.