Úvod
case
bash příkaz je nejjednodušší formou podmíněného příkazu if elif else. case
příkaz zjednodušuje složité podmínky s více různými možnostmi. Toto prohlášení se snáze udržuje a je čitelnější než vnořené if
prohlášení.
case
příkaz testuje vstupní hodnotu, dokud nenajde odpovídající vzor a nespustí příkaz spojený s touto vstupní hodnotou. Jedná se tedy o vynikající volbu pro vytváření nabídek, kde uživatelé vybírají možnost, která spustí odpovídající akci.
V tomto tutoriálu se naučíte case
bash základy prohlášení a jak jej používat ve skriptech shellu.
Předpoklady
- Počítač se systémem Linux.
- Přístup k příkazovému řádku.
- Textový editor, jako je vi/vim.
Syntaxe příkazu Bash case
case
bash příkaz má následující syntaxi:
case $variable in
pattern-1)
commands;;
pattern-2)
commands;;
pattern-3)
commands;;
pattern-N)
commands;;
*)
commands;;
esac
case
příkaz začíná case
klíčové slovo následované $variable
a in
klíčové slovo. Příkaz končí case
klíčové slovo pozpátku - esac
.
$variable
- Skript porovnává vstup
$variable
proti vzorům v každé klauzuli, dokud nenajde shodu.
Vzory
- Vzor a jeho příkazy tvoří klauzuli , která končí na
;;
. - Vzory podporují speciální znaky.
)
operátor ukončí seznam vzorů.|
operátor odděluje více vzorů.- Skript provede příkazy odpovídající prvnímu vzoru odpovídajícímu vstupu
$variable
. - Hvězdička
*
symbol definuje výchozí velikost písmen, obvykle v konečném vzoru.
Stav ukončení
Skript má dva stavy ukončení:
- 0 . Návratový stav, když vstup neodpovídá žádnému vzoru.
- Stav provedeného příkazu . Pokud příkaz odpovídá vstupní proměnné vzoru, vrátí se stav ukončení provedeného příkazu.
Příklady příkazů Bash case
Tato část ukazuje praktické příklady použití case
bash prohlášení.
Příklad 1:Výstup popisu pro každou možnost
Následující příklad je skript, který umožňuje uživateli vybrat barvu a zobrazuje komentář odpovídající vstupu pomocí příkazu echo.
Postupujte podle pokynů níže:
1. Otevřete terminál (Ctrl + Alt + T ) a vytvořte skript:
vi color.sh
2. Přidejte do skriptu následující řádky:
#!/bin/bash
echo "Which color do you like best?"
echo "1 - Blue"
echo "2 - Red"
echo "3 - Yellow"
echo "4 - Green"
echo "5 - Orange"
read color;
case $color in
1) echo "Blue is a primary color.";;
2) echo "Red is a primary color.";;
3) echo "Yellow is a primary color.";;
4) echo "Green is a secondary color.";;
5) echo "Orange is a secondary color.";;
*) echo "This color is not available. Please choose a different one.";;
esac
Každý z řádků má následující roli:
- První řádek v každém skriptu je obvykle shebang (
#!
), který dá operačnímu systému pokyn, který interpret má použít k analýze souboru. - Řádky 2–7 představují nabídku možností, ze které si uživatel může vybrat.
read color;
proměnná vyzve uživatele k odpovědi a uloží ji.- Případ
case
obsahuje možné odpovědi, které odpovídají zadání uživatele. V tomto příkladu je výstupemecho
výstup příkazu. - Poslední řádek,
esac
, ukončícase
prohlášení.
3. Uložte skript a ukončete vi pomocí následujícího příkazu:
:wq
4. Před spuštěním každého skriptu se ujistěte, že jste jej upravili tak, aby byl spustitelný:
chmod +x color.sh
5. Spusťte skript:
./color.sh
Skript nabízí nabídku možností a vydává různé zprávy v závislosti na vybrané možnosti.
Příklad 2:Použití více vzorů
case
příkaz umožňuje použití více vzorů v každé klauzuli. Pokud výraz odpovídá zadaným vzorům, skript provede příkazy v této klauzuli.
Tento ukázkový skript vyzve uživatele k zadání měsíce a vypíše počet dní. Existují tři možné odpovědi:
- 30 dní.
- 31 dní.
- 28 nebo 29 dní na únor.
Pro vytvoření skriptu postupujte podle následujících kroků:
1. Vytvořte skript month.sh spuštěním:
vi month.sh
2. Zadejte následující řádky a skript uložte:
#!/bin/bash
shopt -s nocasematch
echo "Enter the name of a month."
read month
case $month in
February)
echo "There are 28/29 days in $month.";;
April | June | September | November)
echo "There are 30 days in $month.";;
January | March | May | July | August | October | December)
echo "There are 31 days in $month.";;
*)
echo "Unknown month. Please check if you entered the correct month name: $month";;
esac
Ve výše uvedeném příkladu:
shopt
pomocí příkazu-s nocasematch
možnost snižuje šanci na chybu, protože při shodě vzorů se nerozlišují velká a malá písmena.- Symbol potrubí
|
odděluje vzory v každé z vět.
3. Nastavte skript jako spustitelný:
chmod +x month.sh
4. Spusťte skript:
./month.sh
Skript ignoruje rozdíly ve velikosti písmen a vypíše správný počet dní ve vybraném měsíci.
Příklad 3:pro smyčky
Použijte for
smyčka v case
příkazy, kdy je potřeba zpracovat mnoho výrazů. Následující skript vrací všechny typy souborů z adresáře.
Postupujte podle následujících kroků:
1. Vytvořte skript shellu:
vi filelist.sh
2. Zadejte následující řádky a skript uložte:
#!/bin/bash
for file in $(ls)
do
Extension=${file##*.}
case "$Extension" in
sh) echo "Shell script: $file";;
md) echo "A markdown file: $file";;
png) echo "PNG image file: $file";;
txt) echo "A text file: $file";;
zip) echo "An archive: $file";;
conf) echo "A configuration file: $file";;
py) echo "A Python script: $file";;
*) echo "Unknown file type: $file";;
esac
done
Ve výše uvedeném příkladu:
- ls příkaz vytáhne seznam souborů z adresáře.
- Položka
for
loop použije globování souborů k extrahování přípon každého souboru.
3. Nastavte skript jako spustitelný:
chmod +x filelist.sh
4. Spusťte skript:
./filelist.sh
Skript identifikuje každý typ souboru přítomný v aktuálním adresáři.
Příklad 4:Vytvoření adresáře
Použijte case
vytvořit jednoduchou databázi a rychle vygenerovat požadované informace. Následující příklad vypíše jméno, e-mailovou adresu a adresu vybrané osoby:
1. Vytvořte skript:
vi phonebook.sh
2. Přidejte následující řádky a uložte skript:
#!/bin/bash
echo "Choose a contact to display information:"
echo "[C]hris Ramsey"
echo "[J]ames Gardner"
echo "[S]arah Snyder"
echo "[R]ose Armstrong"
read person
case "$person" in
"C" | "c" ) echo "Chris Ramsey"
echo "[email protected]"
echo "27 Railroad Dr. Bayside, NY";;
"J" | "j" ) echo "James Gardner"
echo "[email protected]"
echo "31 Green Street, Green Cove Springs, FL";;
"S" | "s") echo "Sarah Snyder"
echo "[email protected]"
echo "8059 N. Hartford Court, Syosset, NY";;
"R" | "r") echo "Rose Armstrong"
echo "[email protected]"
echo "49 Woodside St., Oak Forest, IL";;
*) echo "Contact doesn't exist.";;
esac
3. Upravte skript:
chmod +x phonebook.sh
3. Spusťte skript:
./phonebook.sh
Skript vypíše kontaktní údaje na vybranou osobu. Výběr možnosti, která není uvedena, upozorní uživatele, že kontakt neexistuje.
Příklad 5:Zkontrolujte typ znaku
Následující příklad ukazuje, jak používat case
pro kontrolu, jaký typ znaku uživatel zadal.
Postupujte podle následujících kroků:
1. Vytvořte skript:
vi character.sh
2. Přidejte následující řádky a uložte skript:
#!/bin/bash
echo "Enter a character:"
read var
case $var in
[[:lower:]) echo "You entered a lowercase character.";;
[[:upper:]]) echo "You entered an uppercase character.";;
[0-9]) echo "You entered a digit.";;
?) echo "You entered a special character.";;
*) echo "You entered multiple characters.";;
esac
Ve výše uvedeném příkladu:
$var
řídicí proměnná ukládá vstup.- Namísto psaní všech možných kombinací použijte hranaté závorky
[]
k označení rozsahu znaků. Použijte dvojité hranaté závorky[[]]
pro rozsahy POSIX.if-else
vyžaduje zadání každé podmínky znaku samostatně. ?
znak zakrývá znaky, které nejsou malými písmeny, velkými písmeny nebo číslicemi. Nahrazuje pouze jeden znak, na rozdíl od*
který nahrazuje vše ostatní, na co se nevztahují výše uvedené podmínky.
3. Změňte oprávnění, aby byl skript spustitelný:
chmod +x character.sh
4. Spusťte skript:
./character.sh
Výstup uvádí typ zadaného znaku po jeho porovnání se zadanými podmínkami.