16Kapitola

Bash 16: select

V tomto díle seriálu nás čeká poslední z větvicích konstrukcí - příkaz select. Umožní nám snadno vytvářet textové nabídky, ze kterých si bude moci uživatel vybírat.

Příkaz select

Mějme seznam nějakých možností a chtějme, aby si z nich uživatel mohl vybrat. To je zadání jako šité na míru pro příkaz select. Příbalový leták (v našem případě manuálová stránka) nám radí postupovat takto: select jmeno [ in seznam ] ; do prikazy ; done. Na místo jmeno doplníme jméno proměnné bez znaku dolar.

Select v angličtině znamená vybrat, zvolit a vyvolit. V roli přídavného jména pak výběrový a exkluzivní. Osobně jsem se s tímto slovem setkal prvně na osmibitových počítačích Atari, kde byl select prostřední z pěti systémových kláves.

Hranaté závorky říkají, že slůvko in a následující seznam hodnot oddělených mezerami nejsou povinné. My je však uvádět budeme a select nám z nich posléze sestaví přehlednou nabídku. Pomocné do již známe, následuje seznam příkazů oddělených středníkem nebo novým řádkem a konstrukci zakončuje done.

Použití ve skriptech

Nejlépe si to samozřejmě ukážeme na příkladu. Začíná jaro, ve vzduchu se vznáší různé věci, třeba volby nebo chřipka. Zeptejme se uživatelů, co nejčastěji na chřipku používají:

select lek in multivitamín tamiflu viagra ; do echo Vybráno: $lek ; done

Po zadání tohoto řádku do Bashe se zobrazí číslovaný seznam o třech položkách (multivitamín, tamiflu, viagra) a pod ním výzva k odpovědi (čekající kurzor a zvláštní forma promptu). Odpovídáme číslem a klávesou [Enter] (Return). Do proměnné lek je vložena příslušná položka seznamu (nikoli číslo), jak můžeme vidět na výpisu jejího obsahu příkazem echo.

Možná vás zaskočí, že konstrukce se neukončí a ptá se znovu. Opravdu se chová jako smyčka. Při vkládání z klávesnice ji nezastaví ani prázdný řetězec, tedy pokud naprázdno odentrujeme. Ostatně vložíme-li cokoli nad rozsah seznamu, nabude proměnná hodnotu prázdného řetězce. Vkládání ukončíme kombinací kláves [Ctrl+d]. Chování selectu jakožto smyčky můžeme potlačit uvedením break jako posledního v seznamu prováděných příkazů před závěrečným done. Ukážeme si to na dalším příkladu, tentokrát rozepsaném na více řádků. Mnohé lidi postihne viróza v důsledku špatně těsnících oken. Zeptejme se jich tedy, kudy nejvíce táhne:

echo "Zvolte typ oken:"
select okno in dřevěná plastová ikspé; do
echo "Nejděravější okna jsou "$okno
break
done

Select má své výhody i nevýhody. Mezi klady patří jistě skutečnost, že seznam nejen automaticky očísluje, ale také jej naformátuje do sloupců, pokud by byl příliš dlouhý. Pohodlné je v některých případech zadávat seznam položek pomocí pole (viz 5. díl). Nevýhodou case je naopak zase to, že si nemůžete zvolit vlastní způsob označování jednotlivých položek. Horší však je, že bez ohledu na odpověď vykonává vždy stejné příkazy.

 

Alternativa

Pokud bychom chtěli, aby se při různých odpovědích vykonávaly různé sady příkazů, museli bychom to udělat pomocí konstrukce case vložené mezi příkazy uvnitř konstrukce select. Když k tomu připočtu svou lenost, tedy neochotu enterovat po každém výběru, jsem již krůček od toho, abych si seznam vytvořil ručně. Přepis výše uvedeného výběru by tak mohl vypadat třeba takto:

echo "Zvolte typ oken:"
echo "a) dřevěná"
echo "b) plastová"
echo "c) ikspé"
echo -n "#> "
read -n 1 okno
echo
case $okno in
a) echo "Zkuste plast" ;;
b) echo "To mne překvapuje" ;;
c) echo "Aha..." ;;
*) echo "Nesprávný výběr" ;;
esac

Nejpre jsem pomocí echo vytvořil seznam i s promptem pro kurzor. Položky jsou označeny písmeny. Potom pomocí read -n 1 (viz 14. díl) načítám právě jeden znak do proměnné okno. Na základě její hodnoty se pak s pomocí case (viz 15. díl) vypíše příslušný text.

Závěr

Dnes jsme probrali poslední z konstrukcí, které nám Bash pro skriptování nabízí. Nebuďte ale smutní, ještě několik interních příkazů neznáme. Také jsme neprobrali lecjaké fígle. Příště si ukážeme některé takové se zvláštním druhem proměnných. A další díl pak bude opakovací.