Příkaz case
Case nám podobně jako if umožňuje vytvořit konstrukci, ve které se budou provádět za různých okolností různé příkazy nebo skupiny příkazů. Ve spojení s minule probíraným read vytváří ideální prostředí pro tvorbu interaktivních skriptů. Read zprostředkuje vstup od uživatele tím, že naplní nějakou proměnou např. znaky z klávesnice a case na základě hodnoty této proměnné provede příslušnou akci.
Tuto situaci bychom samozřejmě mohli řešit také použitím konstrukce if, elif, elif, else, fi. Ta má ovšem složitější formu zápisu a hodí se při rozhodování podle složitějších kritérií. Syntaxe příkazu case začíná slovy case slovo in, kde místo slova vkládáme nejčastěji hodnotu proměnné, tj. jméno proměnné uvozené znakem dolar ($), např. case $promenna in.
Za uvozující formulí následuje seznam hodnot (v závorce, resp. zakončených zavírací závorkou), kterým když proměnná vyhovuje, vykoná se první sada příkazů. Příkazy v sadě jsou odděleny středníkem (nebo koncem řádku) a celá sada je potom zakončena dvěma středníky. Následuje další podmínka a sada příkazů atd. Nakonec můžeme vložit obecnou podmínku znakem hvězdička, což znamená cokoli, co nevyhovovalo předchozím podmínkám. Celá konstrukce je zakončena slovem esac (tj. pozpátku case, podobně jako u if a fi).
Použití ve skriptech
Je mi jasné, že předchozí popis vyžaduje praktickou ukázku. Uvedu krátký skript, který na základě zadání čísla od jedné do pěti pomocí příkazu read -n 1 (viz minulý díl) zobrazí slovní hodnocení školního prospěchu. Hodnotu známky budeme načítat do proměnné znamka.
#!/bin/bash echo "Slovní hodnocení prospěchu" echo -n "Zadejte známku: " read -n 1 znamka echo case $znamka in 1) echo "Výborný" ;; 2) echo "Chvalitebný" ;; 3) echo "Dobrý" ;; 4) echo "Dostatečný" ;; 5) echo "Nedostatečný" ;; *) echo "Neplatná známka" ;; esac
Příkazem read tedy načteme právě jeden znak (read -n 1) z klávesnice a uložíme ho do proměnné znamka. Case potom na základě její hodnoty (case $znamka in) vypíše příslušný text. Nabývá-li hodnot 1 až 5, zobrazí se slovní význam dané známky. Jakýkoli jiný znak (zařizuje *) je označen za neplatnou známku. A nakonec nesmíme zapomenout esac.
Porovnávat můžeme i řetězce delší než jeden znak. Pokud chceme dát do jedné podmínky více hodnot, oddělujeme je svislou čarou (znak |). Lze využívat také jiných zástupných znaků než hvězdička. Jednoduchým je otazník, který nahrazuje jakýkoli jeden znak, podobně jako ve jménech souborů.
Zajímavé jsou hranaté závorky, do kterých lze přímo vypsat přesný seznam znaků, které má závorka nahrazovat. Tak např. [aeiouy] znamená jakákoli malá krátká samohláska. V hranatých závorkách ale můžeme použít i rozsahy ve smyslu od-do. Kupř. [0-9] značí všechny číslice, [a-z] potom všechna malá písmena. Zde ovšem pozor. V závislosti na nastavení jazyka ve vašem systému (echo $LANG) bude tento rozsah zahrnovat i znaky s diakritikou. Pokud tam chcete mít opravdu všechny, měl by zápis mít podobu [a-ž]. Pojďme si ukázat krátký skriptík na určování osoby osobního zájmena.
#!/bin/bash echo "Určení osoby zájmena" echo -n "Zadejte osobní zájmeno: " read zajmeno case $zajmeno in já|my) echo "1. os." ;; [vt]y) echo "2. os." ;; on|on[aioy]) echo "3. os." ;; *) echo "Chyba" ;; esac
Ve třetí osobě se nám mísí použití svislé čáry a hranatých závorek. Věřím, že se vám použití těchto znaků v případě rozhodovacích podmínek case nebude plést s jejich použitím jakožto nepojmenované roury (viz 6. díl) a testu (viz 10. díl). Zápis on|on[aioy] čte Bash jako on nebo ona nebo oni nebo ono nebo ony.
Závěr
Takže z velkých konstrukcí Bashe už známe for, if, while, until a case. Zbývá tedy jen select a na ten se podíváme příště.