Lainlaing Paagi sa Pagbasa sa File sa Bash Script Gamit ang While Loop


Kini nga artikulo bahin sa kung giunsa pagbasa ang mga file sa mga script sa bash gamit ang usa ka while loop. Ang pagbasa sa usa ka file usa ka komon nga operasyon sa programming. Kinahanglan nga pamilyar ka sa lainlaing mga pamaagi ug kung unsang pamaagi ang mas episyente nga gamiton. Sa bash, ang usa ka buluhaton mahimong makab-ot sa daghang mga paagi apan adunay kanunay nga labing maayo nga paagi aron mahuman ang buluhaton ug kinahanglan naton kini sundon.

Sa wala pa makita kung giunsa pagbasa ang mga sulud sa file gamit ang while loop, usa ka dali nga primer kung giunsa ang while loop molihok. Samtang ang loop nag-evaluate sa usa ka kondisyon ug nag-uli sa usa ka gihatag nga hugpong sa mga code kung ang kondisyon tinuod.

while [ CONDITION ]
do
    code block
done

Atong bungkagon while loop syntax.

  • while loop kinahanglan magsugod sa usa ka while keyword nga gisundan sa usa ka kondisyon.
  • Ang usa ka kondisyon kinahanglang ilakip sulod sa [ ] o [[ ]]. Ang kondisyon kinahanglan kanunay nga mobalik nga tinuod alang sa loop nga ipatuman.
  • Ang aktuwal nga block sa code ibutang tali sa do ug done.

NUMBER=0

while [[ $NUMBER -le 10 ]]
do
    echo " Welcome ${NUMBER} times "
    (( NUMBER++ ))
done

Kini usa ka yano nga pananglitan, diin ang loop nagpatuman hangtod ang NUMERO dili labaw sa 10 ug giimprinta ang echo nga pahayag.

Uban sa samtang atong gamiton ang read command sa pagbasa sa mga sulod sa usa ka file linya sa linya. Sa ubos mao ang syntax kung giunsa paghiusa ang mga command samtang ug pagbasa. Karon adunay lain-laing mga paagi sa pagpasa sa file isip input ug atong makita silang tanan.

# SYNTAX
while read VARIABLE
do
    code
done

Piping sa Linux

Kasagaran atong gamiton ang matang, ug uban pa.

Sa susama, atong gamiton ang cat command dinhi aron mabasa ang sulod sa file ug i-pipe kini sa usa ka while loop. Para sa demonstrasyon, naggamit ko og /etc/passwd file pero dili maayo nga samokon kini nga file busa pagkuha ug backup nga kopya niini nga file ug dulaa kini kung gusto nimo.

cat /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Atong gub-on kung unsa ang mahitabo kung ang code sa ibabaw gisumite.

  • Ang cat /etc/passwd mobasa sa sulod sa file ug mopasa niini isip input pinaagi sa pipe.
  • Ang read command nagbasa sa matag linya nga gipasa isip input gikan sa cat command ug nagtago niini sa LREAD variable.
  • Ang
  • read command mobasa sa mga sulod sa file hangtod mahubad ang EOL.

Mahimo usab nimo gamiton ang ubang mga sugo sama sa ulo, ikog, ug pipe kini sa while loop.

head -n 5 /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Pag-redirect sa Input sa Linux

Mahimo natong i-redirect ang sulod sa file ngadto sa while loop gamit ang Input redirection operator (<).

while read LREAD
do
    echo ${LREAD}
done < /etc/passwd | head -n 5

Mahimo usab nimo tipigan ang ngalan sa file sa usa ka variable ug ipasa kini sa usa ka operator sa pag-redirect.

FILENAME="/etc/passwd"

while read LREAD
do
    echo ${LREAD}
done < ${FILENAME}

Mahimo usab nimong ipasa ang mga ngalan sa file isip argumento sa imong script.

while read LREAD
do
    echo ${LREAD}
done < $1 | head -n 5

Internal nga Field Separator

Mahimo kang magtrabaho uban ang lain-laing mga matang sa mga format sa file (CSV, TXT, JSON) ug mahimo nimong ibahin ang sulod sa file base sa custom delimiter. Sa kini nga kaso, mahimo nimong gamiton ang \Internal field separator (IFS) aron mabahin ang sulud sa file ug itago kini sa mga variable.

Tugoti ako nga ipakita kung giunsa kini molihok. Tan-awa ang /etc/passwd file nga adunay colon (:) isip delimiter. Mahimo nimong bahinon ang matag pulong gikan sa usa ka linya ug itago kini sa usa ka lahi nga variable.

Sa ubos nga pananglitan, akong gibahin ang /etc/passwd file nga adunay colon isip akong separator ug gitipigan ang matag split ngadto sa lain-laing mga variable.

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

Usa lang ka linya ang akong gipakita sa screenshot sa ibabaw nga gikonsiderar ang gidak-on sa screenshot.

Walay sulod nga mga Linya sa Linux

Ang mga walay sulod nga linya dili ibaliwala kung imong gilibot ang sulud sa file. Aron ipakita kini naghimo ako usa ka sample file nga adunay sulud sa ubos. Adunay 4 ka linya ug pipila ka walay sulod nga linya, nag-una nga whitespace, nagsubay nga puti nga luna, tab nga mga karakter sa linya 2, ug pipila ka escape character (\n ug \t).

while read LREAD
do
    echo ${LREAD}
done < testfile

Tan-awa ang resulta, ang blangko nga linya wala gibalewala. Usab, usa ka makapaikag nga butang nga matikdan mao kung giunsa ang puti nga mga wanang giputol pinaagi sa read command. Usa ka yano nga paagi sa pagbaliwala sa mga blangko nga linya kung nagbasa sa sulud sa file mao ang paggamit sa test operator nga adunay bandila nga -z nga nagsusi kung ang gitas-on sa kuwerdas zero. Karon atong balikon ang sama nga pananglitan apan niining higayona sa usa ka test operator.

while read LREAD
do
    if [[ ! -z $LREAD ]]
    then
        echo ${LREAD} 
    fi
done < testfile

Karon gikan sa output, imong makita ang walay sulod nga mga linya nga gibalewala.

Makaikyas nga mga Karakter

Ang mga karakter sa pag-ikyas sama sa \n, \t, \c dili maimprinta kung magbasa og file. Aron ipakita kini gigamit nako ang parehas nga sample file nga adunay pipila nga mga karakter sa pag-ikyas.

while read LREAD
do
    echo ${LREAD}
done < testfile

Makita nimo gikan sa output escape ang mga karakter nga nawad-an sa kahulogan ug n ug t ra ang giimprinta imbes nga \n ug \t. Mahimo nimong gamiton ang -r aron mapugngan ang paghubad sa backslash.

while read -r LREAD
do
    echo ${LREAD}
done < testfile

Mao kana alang niini nga artikulo. Gusto namon nga madungog gikan kanimo kung adunay bisan unsang mga feedback o tip. Ang imong feedback mao ang makatabang kanamo sa paghimo og mas maayo nga sulud. Padayon sa pagbasa ug padayon sa pagsuporta.