Kapitola13

Bash 13: Smyčky: while, until, for

Jaký je rozdíl mezi while a until? Co dělá for? Bohdan Milar a smyčky.

Vítám příznivce Bashe u prvního dílu druhého ročníku našeho seriálu. Pevně doufám, že jste se v opakovacím skriptu z minulého dílu neztratili. Dnes nás čekají další dva typy cyklů - while a until.

Smyčka while

Smyčka má obecně tvar while list1; do list2; done, kde list1 a list2 jsou seznamy příkazů. Tělo smyčky se provádí (tj. příkazy v seznamu list2 jsou vykonávány) tak dlouho, dokud poslední příkaz ze skupiny list1 (která se také vykonává před každým průchodem smyčkou) zasílá návratovou hodnotu 0. Pomocné výrazy do a done se používají obdobně jako v případě smyčky for.

Cykly while a until jsou jistou formou kombinace smyčky for (viz 9. díl) a podmínkové konstrukce if (viz 11. díl).

Pro případ, že by se vám z toho motala hlava, zkusíme krátký příklad.

Image

První řádek není součástí smyčky. Při spuštění skriptu pouze nastaví hodnotu proměnné a na "", tedy prázdný řetězec. Jako list1 se často používá podmínka (test) uzavřená do hranatých závorek. Zde v podmínce zkoumáme, zda se hodnota proměnné a NErovná řetězci AAA. Pokud ne (1. průchod "", 2. průchod A, 3. průchod AA), nabývá test hodnotu 0 a list2 může být proveden.



První příkaz uvnitř smyčky (hned za do) přidává k aktuální hodnotě proměnné a znak A. Při prvním průchodu se tak změní z "" na A, při druhém z A na AA a při posledním z AA na AAA. Bližší popis tohoto mechanismu najdete ve 4. části seriálu. Další řádek jen pro kontrolu vypíše hodnotu proměnné a. Podle toho zjistíme, kolikrát smyčka opravdu proběhla. Závěrečná klauzule done vrací běh skriptu opět k while. Ten vyhodnotí podmínku a dle výsledku rozhodne, co dál. Po třetím průchodu má a hodnotu AAA, proto při pokusu o průchod čtvrtý while vstup do smyčky nepovolí a skript pokračuje za done, kde jej čeká konec v podobě exit 0.

Smyčka until

Smyčka until je téměř dvojčetem while. Mají stejnou syntaxi a plní stejnou funkci. Jediným rozdílem je, že zadanou podmínku (resp. výsledek operace list1) vyhodnocuje obráceně. Mohli bychom říci, že while znamená pro počítač "vykonávej, pokud", zatímco until překládá ve smyslu "vykonávej, dokud neplatí".

Pro úpravu našeho skriptu na until bychom museli druhý řádek změnit na until [ "$a" = "AAA" ], který můžeme popsat slovy "Vykonávej, dokud nenastane situace, kdy se hodnota proměnné a rovná AAA". Průběh smyčky i hodnoty proměnné v jednotlivých průbězích jsou shodné s případem použití while.

Názvy příkazů samozřejmě vycházejí z angličtiny - while je "zatímco" a until je "dokud, dokud ne, do té doby než".

Závěr

Opět jsme se ve znalostech nejpoužívanějšího textového příkazového interpretru posunuli kousek dál. Na příště si chystám představení jednoho velmi důležitého pomocníka, kterým je příkaz read. Umožní nám interakci s uživatelem pomocí vstupu z klávesnice v průběhu provádění skriptu.

Výsledek běhu skriptu:

pepa@pocitac:~$ bash13.sh
a = A
a = AA
a = AAA
pepa@pocitac:~$