Do - while cyklus v bashi?

Alidědek

Do - while cyklus v bashi?
« kdy: 13. 11. 2011, 08:57:28 »
Dobrý den.
Začal jsem se učit programovat v bashi, a trochu jsem se zarazil nad cykly. Jsou mi jasné oba for cykly, ale nějak si nesem jistý, zda jsem správně pochopil rozdíl mezi while a until. Očekával bych, že to bude podobné jako v Pascalu, tedy while cyklus má podmínku na začátku a until na konci (céčkově cykly while a do - while). Z materiálů, které jsem přečetl, ale vyplývá, že oba jsou while cykly, a jediný rozdíl mezi nimi spočívá v tom, že u while musí být podmínka splněna a v until nesplněna. Chápu to správně? A pokud ano, dá se udělat do - while cyklus i jinak než opsáním těla cyklu před začátek cyklu?


pecko

  • ***
  • 105
    • Zobrazit profil
    • E-mail
Re: Do - while cyklus v bashi?
« Odpověď #1 kdy: 13. 11. 2011, 09:53:36 »
RTFM dude:)

man bash

"       while list; do list; done
       until list; do list; done
              The while command continuously executes the do list as long as the last command in list returns an exit status of zero.  The until command is identical to the while command, except that the test is negated;  the  do
              list is executed as long as the last command in list returns a non-zero exit status.  The exit status of the while and until commands is the exit status of the last do list command executed, or zero if none was exe‐
              cuted."


declare i; i=1; while [ $i -lt 10 ]; do echo $((i++)); done
1
2
3
4
5
6
7
8
9


declare i; i=1; until [ $i -eq 10 ]; do echo $((i++)); done
1
2
3
4
5
6
7
8
9

kai.101

Re: Do - while cyklus v bashi?
« Odpověď #2 kdy: 13. 11. 2011, 09:56:14 »
Ahoj.

Jestli jste už taky začali brát angličtinu, stačí "man bash" :D
Píše se tam: "The  until command is identical to the while command, except that the test is negated" a to myslím dost výstižně popisuje rozdíl. Osobně jsem nikdy nemusel použít nic jiného než for a while..

Alidědek

Re: Do - while cyklus v bashi?
« Odpověď #3 kdy: 13. 11. 2011, 10:10:54 »
Ve svém dotazu jsem napsal, že jsem se k tomuhle dočetl, ale nechce se mi tomu věřit. Ta poslední věta ("nikdy jsem nepoužil nic jiného než for a while") jasně ukazuje, proč jsem tomu nevěřil - k čemu tam ty dva zápisy de facto téhož jsou?
A s tou angličtinou, to víte, učím se ji teprve třicet let, to si člověk občas ještě něčím není úplně jistý. Třeba tím, že někdo opravdu udělal takovýhle nesmysl...

Za odpovědi děkuju.

aaa158

  • ***
  • 238
    • Zobrazit profil
    • E-mail
Re: Do - while cyklus v bashi?
« Odpověď #4 kdy: 13. 11. 2011, 11:08:17 »
no ono je to tak ze v praxi do..while z pascalu je pekny, ale velmi sa nepouziva. takze otazka naco implementovat nieco co nema velky zmysel plati tak pre bash (until...) ako aj pre pascal (do..while).

asi tak ;-)

inac do..while v bashi by som zapisal asi takto:

Kód: [Vybrat]
# nekonecny cyklus
while [[ 1 ]]; do
  ...
  kod
  ...
  # podmienka na vyskocenie z cyklu
  [[ test ]] && break
done


Alidědek

Re: Do - while cyklus v bashi?
« Odpověď #5 kdy: 13. 11. 2011, 12:03:14 »
Do - while že se nepoužívá? Já ho používám celkem často. Jinak si dost dobře neovedu (v interaktivním prostředí) představit řešení úkolu "získej od uživatele hodnotu, zkontroluj, že splňuje parametry, a když ne, tak si ji vyžádej znovu". Jistě, dá se to obejít různými obezličkami a zápisy, ale ten základní princip do - while cyklu zůstává.
Implemetace dvou různých cyklů (s podmínkou na začátku a s podmínkou na konci), i když se jeden používá výrazně méně, mi připadá rozhodně logičtější a smysluplnější než dva identické cykly, lišící se jenom negací podmínky. Ale to už je jen plané teoretizování.

kei.101

Re: Do - while cyklus v bashi?
« Odpověď #6 kdy: 14. 11. 2011, 09:14:02 »
Do - while že se nepoužívá? Já ho používám celkem často. Jinak si dost dobře neovedu (v interaktivním prostředí) představit řešení úkolu "získej od uživatele hodnotu, zkontroluj, že splňuje parametry, a když ne, tak si ji vyžádej znovu". Jistě, dá se to obejít různými obezličkami a zápisy, ale ten základní princip do - while cyklu zůstává.

Já si to dovedu představit jako:
Kód: [Vybrat]
while (!NactenaHodnota())
    ;

Třeba v pythonu je jen for a while cyklus a je to úplně dostačující.. stejně si v každém jazyku compiler ty instrukce přerovná, pokud není úplně k ničemu..

Kit

Re: Do - while cyklus v bashi?
« Odpověď #7 kdy: 14. 11. 2011, 13:09:22 »
Do - while že se nepoužívá? Já ho používám celkem často. Jinak si dost dobře neovedu (v interaktivním prostředí) představit řešení úkolu "získej od uživatele hodnotu, zkontroluj, že splňuje parametry, a když ne, tak si ji vyžádej znovu".

Do-while se dá snadno simulovat takto:

Kód: [Vybrat]
while ziskej_hodnotu; zkontroluj_parametry; do
   echo "Znovu";
done

aaa158

  • ***
  • 238
    • Zobrazit profil
    • E-mail
Re: Do - while cyklus v bashi?
« Odpověď #8 kdy: 14. 11. 2011, 15:43:15 »
Do - while že se nepoužívá? Já ho používám celkem často. Jinak si dost dobře neovedu (v interaktivním prostředí) představit řešení úkolu "získej od uživatele hodnotu, zkontroluj, že splňuje parametry, a když ne, tak si ji vyžádej znovu". Jistě, dá se to obejít různými obezličkami a zápisy, ale ten základní princip do - while cyklu zůstává.
Implemetace dvou různých cyklů (s podmínkou na začátku a s podmínkou na konci), i když se jeden používá výrazně méně, mi připadá rozhodně logičtější a smysluplnější než dva identické cykly, lišící se jenom negací podmínky. Ale to už je jen plané teoretizování.

Neviem ci je to "obezlicka" ale kod ktory som napisal je do..while. Lisi sa iba klucovymi slovami. Teoreticky sa kazdy cyklus da zapisat pomocou "for" :-) (v C, Pascale, ...)

Radovan

Re: Do - while cyklus v bashi?
« Odpověď #9 kdy: 14. 11. 2011, 19:20:10 »
S FOR v Pascalu teda fakt ne :-D

Jakub Váňa

Re: Do - while cyklus v bashi?
« Odpověď #10 kdy: 14. 11. 2011, 20:08:40 »
:D Vaše starosti bych chtěl mít :D

Kit

Re: Do - while cyklus v bashi?
« Odpověď #11 kdy: 14. 11. 2011, 21:21:03 »
Teoreticky sa kazdy cyklus da zapisat pomocou "for" :-) (v C, Pascale, ...)
Také se teoreticky každý cyklus dá nahradit rekurzí.
A také se hromada cyklů dá nahradit různými integritními omezeními případně funkcemi a metodami, které vyšší programovací jazyky obvykle nabízí.

NoName

Re: Do - while cyklus v bashi?
« Odpověď #12 kdy: 14. 11. 2011, 22:59:25 »
Teoreticky se dá nahradit každý cyklus každým. Teoreticky stačí umět přičíst jedničku, odečíst jedničku a poznal nulu...

Každá funkce programovacího jazyka navíc je větším pohodlím pro programátora. Některé usnadňují práci podstatně (ušetří pár hodin práce), některé nepatrně (ušetří pár sekund práce).