Linux E X P R E S

Facebook

Bash 15: case

Pokud jste sami nepřišli na to, jak s pomocí read (který jsme brali minule) vytvářet textové rozhraní pro komunikaci s uživatelem, bude se vám jistě hodit příkaz case, který si ukážeme tentokrát.


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

Diskuze (0) Nahoru