PředchozíNahoruDalšíObsah

4.2 While ... do ... done

Struktura while je struktura cyklu. V podstatě vykonává blok příkazů tak dlouho, dokud je splněna podmínka uvedena za slovem while. Příklad struktury while je zde:

#!/bin/bash
while true; do
  echo "Press Ctrl-C to quit."
done

Příkaz true je program, který vždy vrací hodnotu true (pravda). Náš skript tedy bude neustále opakovat vypisování hlášky jak ukončit program a to až do té doby než ho uměle přerušíme (Ctrl-C). Způsob volání true je však poněkud pomalý, protože systém musí vždy spouštět program true. Existuje rychlejší varianta jak docílit toho samého příkladu jak před tím a to použítím dvojtečky místo true:

#!/bin/bash
while :; do
  echo "Press Ctrl-C to quit."
done

Dvojtečka je totiž interní příkaz interpretru bash. Tento příklad je však poněkud nepraktický, tak pojđme na další už více užitečný.

V následujícím příkladu použijeme proměnnou x, která bude při každém průchodu cyklu zvyšovat svojí hodnotu a to až do té doby než dosáhne hodnoty 10.

#!/bin/bash
x=0;     # inicializuje hodnotu x na 0
while [ "$x" -le 10 ]; do
  echo "Aktuální hodnota x: $x"
  # zvýšení hodnoty x o 1
  x=$(expr $x + 1)
  sleep 1
done

Jak vidíte, používáme příkaz test (hranaté závorky), abychom zjistili, jestli hodnota proměnné x je menší nebo rovno 10. Je-li menší nebo rovno 10, test je vyhodnoceno jako true a blok příkazů za slovem do se může provést. Je-li však podmínka vyhodnocena jako false, pokračuje program v běhu za slovem done.

Následující tabulka shrnuje další možnosti příkazu test.

Možnosti příkazu test
Pro čísla:
x -eq y Testuje, jestli x=y
x -ne y Testuje, jestli x!=y (nerovná se)
x -qt y Testjue, jestli x>y
x -lt y Testuje, jestli x<y
Pro řetězce:
x = y Testuje, jsou-li řetězce shodné
x != y Testuje, jsou-li řetězce rozdílné
-n x Vrátí true, není-li řetězec prázdný
-z x Vrátí true, je-li řetězec prázdný

Věřím, že nebude těžké porozumět i dalšímu příkazu ve skriptu a to je expr. Tento příkaz ve skriptu přičte k proměnné x hodnotu 1 a vrátí to do x. Ale co znamená $(...)? Tato konstrukce zařídí, že hodnota výsledeku výrazu v závorkách se zapíše jako hodnota do výrazu, který tuto konstrukci obsahuje. Je tedy možné tímto způsobem například zjistit pod jakým jménem jsme přihlášeni do systému. Příklad:

#!/bin/bash
x=$(whoami)
echo "Já jsem $x."

Samozřejmě lze také tímto způsobem dostat hodnotu vrácenou příkazem whoami přímo do řetězce. A to takto:

#!/bin/bash
echo "Já jsem $(whoami)."

Můžete se rozhodnout, který způsob je pro vás lepší. Konstrukce $(...) nám tedy dává opět další prostředek jak spustit příkaz a ještě použít hodnotu, kterou příkaz vrátí.

PředchozíNahoruDalšíObsah

9. dubna 2001 19:38