Kupte si tento Shell Scripting Tutorial ve formátu PDF za pouhých 5 dolarů

Test používá prakticky každý napsaný shell skript. Možná se to tak nezdá, protožetest není často volán přímo. testse v systému častěji volá jako

if SPACE 

Test is a simple but powerful comparison utility. For full details, run man test, ale zde jsou některá použití a typické příklady.

Test se nejčastěji vyvolává nepřímo prostřednictvím příkazů if awhile. To je také důvod, proč se dostanete do potíží, pokud vytvoříte program s názvem test a pokusíte se ho spustit, protože tato vestavba shellu bude volána místo vašeho programu!
Syntaxe pro if...then...else... je:

if then # if-codeelse # else-codefi
if ; then # do somethingfi

Můžete také použít elif, například takto:

if ; then echo "Something" elif ; then echo "Something else" else echo "None of the above"fi

Vyzkoušejte následující úryvek kódu, před jeho spuštěním nastavte proměnnou X na různé hodnoty (zkuste -1, 0, 1, hello, bye atd.). Můžete to udělat takto (děkujeme Daveovi za upozornění na nutnost exportovat proměnnou, jak je uvedeno v částiProměnné - část I.):

$ X=5$ export X$ ./test.sh ... output of test.sh ...$ X=hello$ ./test.sh ... output of test.sh ...$ X=test.sh$ ./test.sh ... output of test.sh ...

Pak to zkuste znovu, přičemž $X bude název existujícího souboru, například /etc/hosts.

test.sh

Všimněte si, že můžeme použít středník (;) pro spojení dvou řádků. To se často dělá proto, aby se ušetřilo trochu místa v jednoduchých příkazech if.
Zpětné lomítko (\) slouží podobnému, ale opačnému účelu: říká shellu, že toto není konec řádku, ale že následující řádek má být považován za součást aktuálního řádku. To je užitečné kvůli čitelnosti. Je obvyklé odsazovat následující řádek za zpětným lomítkem (\) nebo středníkem (;).

Příklad středník (;) se často používá takto pro spojení klíčových slov if a then:

if ; then echo "X is a file which is newer than /etc/passwd"fi

zatímco zpětné lomítko (\) se používá pro rozdělení jednořádkového příkazu na dva řádky v souboru shellového skriptu z důvodu čitelnosti:

 && \ echo "X is a file which is newer than /etc/passwd"

Jak vidíme z těchto příkladů, test může provádět mnoho testů čísel, řetězců a názvů souborů.

Existuje i jednodušší způsob zápisu příkazů if:

Tato syntaxe je možná, protože existuje soubor (nebo shell-builtin) s názvem konstrukce se doporučuje pro while cykly a triviální sanitární kontroly, kterými nechcete příliš rozptylovat čtenáře.

Všimněte si, že když nastavíte X na jinou než číselnou hodnotu, prvních několik porovnánívyústí ve zprávu:

Je to proto, že porovnávání pomocí -lt, -gt, -le a -ge je určeno pouze pro celá čísla a nefunguje na řetězce. Porovnávání řetězců, například !=, ochotně zpracuje "5" jako řetězec, ale neexistuje žádný rozumný způsob, jak zpracovat "Hello" jako celé číslo, takže porovnávání celých čísel si stěžuje.
Pokud chcete, aby se váš shellový skript choval šetrněji, budete muset před testováním zkontrolovat obsah proměnné - třeba nějak takto:

Takto můžete echopředat uživateli smysluplnější zprávu a elegantně ukončit skript. Proměnná $? je vysvětlena v části Proměnné - část II a grep je složité zvíře, takže tady je: grep najde řádky textu, které obsahují číslice (0-9) a případně další znaky, takže caret (^) v grep najde pouze ty řádky, které se neskládají pouze z čísel. Pak můžeme postupovat opačně (působením na neúspěch, nikoliv na úspěch). Dobře? >/dev/null 2>&1 nasměruje jakýkolivýstup nebo chybu do speciálního zařízení "null", místo aby šel na obrazovku uživatele.
Moc děkuji Paulu Schermerhornovi za opravu - na této stránce se dříve tvrdilo, že bude fungovat grep -v , ale to je zjevně příliš zjednodušené.

Test můžeme použít v while smyčkách takto:

test2.sh

#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X echo "You said: $X"done

Tento kód bude žádat o vstup, dokud nestisknete RETURN (X má nulovou délku)." Díky Justinu Heathovi za upozornění, že skript nefunguje - v while jsem vynechal uvozovky kolem $X. Bez těchto uvozovek není co testovat, když je $X prázdný.
Alexander Weber upozornil, že spuštění tohoto skriptu skončí neúhledně:

To lze uklidit dalším testem uvnitř smyčky:

#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X if ; then echo "You said: $X" fidone

Všimněte si také, že jsem na této stránce použil dvě různé syntaxe pro příkazy if. Jsou to:

if then echo "X is less than zero"fi.......... and ........if ; then echo "You said: $X"fi

Mezi příkazem if a konstrukcí then musíte mít přerušení. Může to být středník nebo nový řádek, nezáleží na tom, který, ale mezi if a then musí být jeden nebo druhý. bylo by hezké říci jen:

if echo "You said: $X"

ale then a fi jsou bezpodmínečně nutné.


Zpět: Smyčky Další: Případ

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.