Kif Ikteb Bash WHILE-Loops

Kmandijiet, Sintaxxa u Eżempji

Tista 'twettaq sekwenza ta' kmandi billi tiktebhom f'fajl b'kitba u mbagħad tmexxih.

Fajl b'kitba huwa sempliċiment fajl ta 'test, ġeneralment bl-estensjoni tal-fajl .SH, li fih sekwenza ta' struzzjonijiet li jistgħu wkoll jiġu eżegwiti mil-linja tal-kmand ( qoxra ).

Filwaqt li Eżempji Loop

Hawn taħt huwa eżempju ta 'filwaqt li. Meta jiġi eżegwit, dan il-fajl b'kitba se jipprintja n-numri 1 sa 9 fuq l-iskrin. L-istqarrija waqt li tagħtik aktar flessibilità biex tispeċifika l-kundizzjoni ta 'terminazzjoni mill- for-loop .

#! / bin / bash count = 1 filwaqt li [$ count -le 9] do echo "$ count" irqad 1 ((għadd ++)) magħmul

Per eżempju, tista 'tagħmel l-iskritt ta' qabel ħolqa infinita billi tħalli barra d-dikjarazzjoni ta 'żieda "((għadd ++))":

#! / bin / bash count = 1 filwaqt li [$ count -le 9] do echo "$ count" sleep 1 magħmul

Id-dikjarazzjoni "sleep 1" twaqqaf l-eżekuzzjoni għal sekonda waħda fuq kull iterazzjoni. Uża l-buttuna Ctrl + C keyboard biex ittemm il-proċess.

Tista 'wkoll toħloq linja infinita billi tqiegħed il-kolon bħala l-kundizzjoni:

#! / bin / bash count = 1 filwaqt li: do echo "$ count" sleep 1 ((għadd ++)) magħmul

Sabiex tuża kondizzjonijiet multipli fil-waqt-loop, għandek tuża n-notazzjoni tal-parentesi doppja doppja:

għadd = 1 magħmul = 0 filwaqt li [[$ count -le 9] && [$ magħmul == 0]] jagħmlu echo "$ count" sleep 1 ((count ++)) jekk [$ count == 5]; imbagħad $ isir = 1 fi jsir

F'dan l-iskritt, il-varjabbli "magħmul" huwa inizjalat għal 0 u mbagħad jitwaħħal ma '1 meta l-għadd jilħaq 5. Il-kondizzjoni tal-linja tistqarr li l-linja waqt li tkompli titkompla sakemm "għadd" ikun inqas minn disa u "magħmul" ikun ugwali għal żero. Għalhekk il-ħolqa toħroġ meta l-għadd huwa ugwali għal 5.

Il- "&&" tfisser "loġika" u "u" || " tfisser "jew" loġiku.

Notazzjoni alternattiva għall-konġunzjonijiet "u" u "jew" f'kondizzjonijiet hija "-a" u "-o" b'parentesi kwadri singoli. Il-kundizzjoni t'hawn fuq:

[[$ count -le 9] && [$ magħmul == 0]]

... tista 'terġa' tiġi miktuba bħala:

[$ count -le 9] -a [$ magħmul == 0]

Qari ta 'fajl ta' test ġeneralment isir bi ftit ċaqliq. Fl-eżempju li ġej, l-iskrittura bażika taqra l-kontenut tal-linja bil-linja ta 'fajl imsejjaħ "inventory.txt:"

FILE = inventory.txt exec 6

L-ewwel linja tassenja l-isem tal-fajl tad-dħul għall-varjabbli "FILE". It-tieni linja tiffranka l- "input standard" fid-deskrittur tal-fajl "6" (jista 'jkun kwalunkwe valur bejn 3 u 9). Dan isir hekk li "input standard" jista 'jiġi rrestawrat għad-deskrittur tal-fajl "0" fi tmiem l-iskritt (ara d-dikjarazzjoni "exec 0 Fit-tielet linja l-fajl input jiġi assenjat lid-deskrittur ta' fajl" 0 " għall-input standard Id-dikjarazzjoni "aqra" mbagħad taqra linja mill-fajl fuq kull iterazzjoni u tassenjaha lill-varjabbli "line1".

Sabiex toħroġ prematurament while-loop, tista 'tuża d-dikjarazzjoni break bħal din:

għadd = 1 magħmul = 0 filwaqt li [$ count -le 9] do echo "$ count" irqad 1 ((għadd ++)) jekk [$ count == 5] imbagħad waqfa fi isir eku Irfinut

Id-dikjarazzjoni tal-break tiffaċċja l-eżekuzzjoni tal-programm sa l-aħħar waqt li tħoll u twettaq kwalunkwe dikjarazzjoni li ssegwiha. F'dan il-każ, id-dikjarazzjoni "Echo Finished."

Id-dikjarazzjoni ta 'tkomplija, min-naħa l-oħra, tiskalla biss il-bqija tad-dikjarazzjoni tal-loop waqt iterazzjoni kurrenti u toħroġ direttament għall-iterazzjoni li jmiss:

għadd = 1 magħmul = 0 filwaqt li [$ count -le 9] jorqdu 1 ((count ++)) jekk [$ count == 5] imbagħad ikompli l-echo "$ count" magħmul echo Find

F'dan il-każ, id-dikjarazzjoni "tkompli" tiġi eżegwita meta l-varjabbli "count" jilħaq 5. Dan ifisser li d-dikjarazzjoni sussegwenti (echo "$ count") ma tiġix eżegwita fuq din iterazzjoni (meta l-valur ta '"count" huwa 5).