Modi differenti biex taqra l-fajl fl-iskrittura ta' Bash billi tuża While Loop


Dan l-artikolu huwa kollu dwar kif taqra fajls fi skripts bash bl-użu ta 'loop while. Il-qari ta' fajl huwa operazzjoni komuni fl-ipprogrammar. Għandek tkun familjari ma 'metodi differenti u liema metodu huwa aktar effiċjenti biex tużah. F'bash, kompitu wieħed jista 'jinkiseb f'ħafna modi iżda dejjem hemm mod ottimali biex il-kompitu jsir u għandna nsegwuh.

Qabel ma tara kif taqra l-kontenut tal-fajl billi tuża while loop, a primer rapidu dwar kif taħdem while loop. Filwaqt li loop jevalwa kundizzjoni u jtenni fuq sett partikolari ta 'kodiċi meta l-kundizzjoni hija vera.

while [ CONDITION ]
do
    code block
done

Ejja nkissru waqt is-sintassi tal-linja.

  • while loop għandu jibda bil-kelma prinċipali while segwita minn kundizzjoni.
  • Kundizzjoni għandha tkun magħluqa fi ħdan [ ] jew [[ ]]. Il-kundizzjoni għandha dejjem tirritorna vera biex il-linja tiġi esegwita.
  • Il-blokk attwali tal-kodiċi se jitqiegħed bejn do u done.

NUMBER=0

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

Dan huwa eżempju sempliċi ħafna, fejn il-linja tesegwixxi sakemm NUMRU ma jkunx akbar minn 10 u jistampa d-dikjarazzjoni tal-eku.

Flimkien ma 'while se nużaw il-kmand tal-qari biex naqraw il-kontenut ta' fajl linja b'linja. Hawn taħt hawn is-sintassi ta' kif il-kmandi waqt u l-qari huma kkombinati. Issa hemm modi differenti biex tgħaddi l-fajl bħala input u narawhom kollha.

# SYNTAX
while read VARIABLE
do
    code
done

Pajping fil-Linux

Normalment se nużaw it-tip, eċċ.

Bl-istess mod, aħna se nużaw il-kmand tal-qtates hawn biex naqraw il-kontenut tal-fajl u pajpha għal while loop. Għad-dimostrazzjoni, qed nuża l-fajl /etc/passwd iżda mhux rakkomandabbli li tħawwad ma' dan il-fajl għalhekk ħu kopja ta' backup ta' dan il-fajl u tilgħab miegħu jekk tixtieq hekk.

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

Ejja nkissru x'se jiġri meta jiġi sottomess il-kodiċi ta 'hawn fuq.

  • cat /etc/passwd se jaqra l-kontenut tal-fajl u jgħaddih bħala input mill-pajp.
  • read kmand jaqra kull linja mgħoddija bħala input mill-kmand tal-qtates u jaħżenha fil-varjabbli LREAD.
  • aqra l-kmand se jaqra l-kontenut tal-fajl sakemm l-EOL jiġi interpretat.

Tista 'wkoll tuża kmandi oħra bħal ras, denb, u pajpha għal while loop.

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

Direzzjoni mill-ġdid tal-input fil-Linux

Nistgħu nidderieġu mill-ġdid il-kontenut tal-fajl għal while loop billi tuża l-operatur ta 'ridirezzjoni ta' Input (<).

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

Tista 'wkoll taħżen l-isem tal-fajl għal varjabbli u tgħaddiha minn operatur ta' direzzjoni mill-ġdid.

FILENAME="/etc/passwd"

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

Tista' wkoll tgħaddi l-ismijiet tal-fajls bħala argument għall-iskrittura tiegħek.

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

Separatur tal-Qasam Intern

Tista 'taħdem ma' tipi differenti ta 'formati ta' fajl (CSV, TXT, JSON) u tista 'tixtieq taqsam il-kontenut tal-fajl ibbażat fuq delimitatur tad-dwana. F'dan il-każ, tista' tuża \Separatur tal-kamp intern (IFS) biex taqsam il-kontenut tal-fajl u taħżen f'varjabbli.

Ħallini nuri kif taħdem. Agħti ħarsa lejn il-fajl /etc/passwd li għandu kolon (:) bħala d-delimitatur. Issa tista 'taqsam kull kelma minn linja u taħżenha f'varjabbli separat.

Fl-eżempju ta 'hawn taħt, qed naqsam il-fajl /etc/passwd b'kolon bħala separatur tiegħi u naħżen kull qasma f'varjabbli differenti.

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

Urejt linja waħda biss maqsuma fil-screenshot ta 'hawn fuq meta wieħed iqis id-daqs tal-screenshot.

Linji vojta fil-Linux

Linji vojta ma jiġux injorati meta tgħaddi l-kontenut tal-fajl. Biex nuri dan ħloqt fajl kampjun bil-kontenut ta 'hawn taħt. Hemm 4 linji u ftit linji vojta, spazju abjad ewlieni, spazju abjad ta 'wara, karattri tat-tab fil-linja 2, u xi karattri ta' ħarba ( u ).

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

Ara r-riżultat, linja vojta mhix injorata. Ukoll, ħaġa interessanti li wieħed jinnota hija kif l-ispazji bojod huma mirquma mill-kmand tal-qari. Mod sempliċi biex jinjora linji vojta meta taqra l-kontenut tal-fajl huwa li tuża l-operatur tat-test bil-marka -z li jiċċekkja jekk it-tul tas-sekwenza huwiex żero. Issa ejja nirrepetu l-istess eżempju iżda din id-darba ma 'operatur tat-test.

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

Issa mill-output, tista 'tara linji vojta huma injorati.

Karattri tal-ħarba

Escape karattri bħal , ,

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

Tista' tara mill-output il-karattri tal-ħarba tilfu t-tifsira tagħhom u n u t biss huma stampati minflok u . Tista' tuża -r biex tevita l-interpretazzjoni ta' backslash.

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

Dak hu għal dan l-artikolu. Nixtiequ nisimgħu lura mingħandek jekk ikun hemm xi feedback jew pariri. Ir-rispons tiegħek huwa dak li jgħinna noħolqu kontenut aħjar. Kompli aqra u kompli ssostni.