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 |
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í.