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.