Při psaní skriptů Bash je běžné porovnávat řetězec s proměnnou a poté provést něco na základě toho, co bylo zadáno.
Zvažte následující skript. Zkontroluje první argument, který uživatel zadá, a provede různé věci v závislosti na tom, co bylo zadáno:
#!/usr/bin/env bash
if [[ "${1}" == "" ]]; then
echo "No shape was specified."
elif [[ "${1}" == "square" ]]; then
echo "You specified 'square'."
elif [[ "${1}" == "circle" ]]; then
echo "You specified 'circle'."
elif [[ "${1}" == "triangle" ]]; then
"You specified 'triangle'."
else
echo "Unknown shape '${1}'."
exit 1
fi
To ukazuje, i když bez funkce, jednoduchý úkol, který může zopakovat známý tvar zpět uživateli, nebo pokud je tvar neznámý, zobrazí chybovou zprávu.
V tomto je vše v pořádku a šmrncovní a vše funguje podle očekávání. Ale podívejte se, kolik řádků to zabralo. Podívejte se, jak musíte zacházet s každou jednotlivou možností, kterou uživatel projde elif
prohlášení?
Nyní má tento program ještě více možností, řekněme 20. Se současným přístupem budete psát if
příkaz s 20 elif
sekce uvnitř.
Jo, z větší části si to asi budete moci přečíst. Ale je neohrabaný, zabírá příliš mnoho místa, a co je nejdůležitější, existuje lepší alternativa.
Představení případu v Bash
Zde přichází na řadu příkazy typu case. Mohou výrazně snížit počet řádků kódu, které potřebujete pro kontrolu věcí, ve srovnání s if
prohlášení.
Totéž if
příkaz, který jste použili ke kontrole poskytnutých možností, lze přepsat takto uvnitř případu jedna:
#!/usr/bin/env bash
case "${1}" in
"") echo "No option was specified."; exit 1 ;;
square) echo "You specified 'square'." ;;
circle) echo "You specified 'circle'." ;;
triangle) echo "You specified 'triangle'." ;;
*) echo "Unknown shape '${1}'."; exit 1 ;;
esac
Podívejte se, jak to vypadá jednodušeji a organizovaněji. To je 12 řádků kódu v if
a pouze 7 v case
jeden. A čím více možností povolíte, tím razantnější bude tento rozdíl.
A to je případ case
prohlášení září. Zatímco oba jsou zcela čitelné, zvláště při malém množství, case
prohlášení jednoduše činí vše čistším a dlouhodobě udržitelnějším.
Jak vytvoříte prohlášení o případu v Bash?
Případová prohlášení jsou docela jednoduchá na pochopení s trochou praxe. Zde jsou základní informace o tom, co se děje:
První řádek, který jste viděli, byl case ${1} in
. ${1}
dává řetězec, proti kterému se bude kontrolovat, zde je první argument předaný skriptu.
Zvažte například tento případ:
case linux in
windows) echo "windows" ;;
macos) echo "macos" ;;
linux) echo "linux" ;;
esac
V tomto příkladu vždy poběží echo "linux"
. case *string* in
part jednoduše specifikuje, proti jakému řetězci budete kontrolovat, a pak možnosti pod ním spustí příkazy, kdykoli bude nalezena shoda.
Dále začnete specifikovat své možnosti. Pamatujte, že jste měli ""
, square
, circle
, triangle
a *
jako možnosti ve vašem prvním skriptu.
Výpisy případů jsou kontrolovány shora dolů a spouštějí se pouze při první shodě. Zvažte následující příklad:
case linux in
linux) echo "linux" ;;
windows) echo "windows" ;;
linux) echo "linux 2.0" ;;
esac
Zde by jediný příkaz, který by se spustil, byl echo "linux"
. Druhá shoda by pak byla přeskočena, protože již byla nalezena shoda.
Každý řádek v příkazu case musí také končit ;;
. To znamená konec seznamu příkazů pro volbu a že by neměly být zpracovávány žádné další příkazy.
Argumenty jsou uvedeny v příkazu case (linux)
a windows)
části také podporují zástupné znaky. Tedy zadáním něčeho jako linu*)
by odpovídaly oběma linux
a linus
.
Nakonec ukončíte prohlášení případu pomocí esac
. Díky tomu bude vědět, že jste uvedli vše, co chcete zpracovat, například done
by udělal v for
nebo while
smyčka.
esac
je case
pozpátku. Případy v praxi – kontroly argumentů
Častým používáním příkazů case v mém vlastním programování je kontrola se seznamem argumentů.
Řekněme, že povolujete poskytování následujících možností vašemu programu:
--vertical
--add-txt
--replace
--verify
Chcete-li to zkontrolovat v prohlášení o případu, můžete použít něco takového:
while [[ "${1}" != "" ]]; do
case "${1}" in
--vertical) verticle="true" ;;
--add-txt) add_txt="true" ;;
--replace) replace="true" ;;
--verify) verify="true" ;;
esac
shift 1
done
Toto spustí while
smyčka while ${1}
(první argument daný skriptu) není prázdný. Poté provede kontrolu se seznamem argumentů a přiřadí proměnné, když je nastavena poskytnutá možnost.
Po kontrole s příkazem case se spustí shift 1
, což způsobí hodnotu ${2}
(druhý argument poskytnutý skriptu) pro přesun na hodnotu ${1}
a zopakuje to s novým ${1}
(což bylo dříve ${2}
) do ${1}
není nastaveno na nic.
A je to! To jsou všechny základy používání případových příkazů.
Zabalení
Příkazy Case vám mohou pomoci psát kód rychleji a efektivněji. Pomáhají také dělat věci čitelnějšími a udržitelnějšími z dlouhodobého hlediska.
Pokud jste v Bash noví, můžete se naučit základy Bash od nuly v naší Bash Beginner Series.
Máte nějaké otázky nebo něco nefunguje správně? Neváhejte a zanechte komentář níže a já se pokusím co nejlépe odpovědět!