Příkaz případu v shellu Bash je podobný příkazu switch v C. Lze jej použít k testování jednoduchých hodnot, jako jsou celá čísla a znaky.
Příkaz Case není smyčka, neprovádí blok kódu nkrát. Místo toho bash shell kontroluje stav a řídí tok programu.
V tomto článku si projdeme příkaz bash case s 5 praktickými příklady.
Konstrukce případu v bash shell nám umožňuje testovat řetězce proti vzorům, které mohou obsahovat zástupné znaky. Příkaz Bash case je nejjednodušší formou příkazu bash if-then-else.
Syntaxe příkazu bash case.
case expression in pattern1 ) statements ;; pattern2 ) statements ;; ... esac
Níže jsou uvedeny klíčové body prohlášení bash case:
- Příkaz Case nejprve rozšíří výraz a pokusí se jej porovnat s každým vzorem.
- Když je nalezena shoda, všechny související příkazy až do provedení dvojitého středníku (;;).
- Po první shodě se případ ukončí stavem ukončení posledního provedeného příkazu.
- Pokud neexistuje žádná shoda, výstupní stav případu je nula.
Příklad Bash 1. Odeslání signálu do procesu
Následující skript přijímá číslo signálu a id procesu jako argumenty a odesílá signál danému id procesu pomocí názvu signálu.
Tento skript má demonstrovat použití příkazu case.
$ cat signal.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage : $0 Signalnumber PID" exit fi case "$1" in 1) echo "Sending SIGHUP signal" kill -SIGHUP $2 ;; 2) echo "Sending SIGINT signal" kill -SIGINT $2 ;; 3) echo "Sending SIGQUIT signal" kill -SIGQUIT $2 ;; 9) echo "Sending SIGKILL signal" kill -SIGKILL $2 ;; *) echo "Signal number $1 is not processed" ;; esac
Ve výše uvedeném příkladu:
- $1 a $2 jsou číslo signálu a ID procesu.
- Pomocí příkazu kill odešle odpovídající signál danému id procesu.
- Provede příkaz spánku po dobu několika sekund.
- Nepovinné poslední srovnání *) je výchozí velikost písmen a shoduje se s čímkoli.
Použití výše uvedeného skriptu shellu:Zjistěte id procesu příkazu sleep a odešlete tomuto id procesu signál zabití, abyste proces ukončili.
$ sleep 1000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signal.sh 9 23277 Sending SIGKILL signal $ sleep 1000 Killed
Podívejte se také na náš dřívější článek o ukončení – 4 způsoby ukončení procesu.
Příklad případu Bash. 2. Shoda vzoru v souboru
Tento příklad vytiskne počet řádků, počet slov a odstraní řádky, které odpovídají danému vzoru.
$ cat fileop.sh #!/bin/bash # Check 3 arguments are given # if [ $# -lt 3 ] then echo "Usage : $0 option pattern filename" exit fi # Check the given file is exist # if [ ! -f $3 ] then echo "Filename given \"$3\" doesn't exist" exit fi case "$1" in # Count number of lines matches -i) echo "Number of lines matches with the pattern $2 :" grep -c -i $2 $3 ;; # Count number of words matches -c) echo "Number of words matches with the pattern $2 :" grep -o -i $2 $3 | wc -l ;; # print all the matched lines -p) echo "Lines matches with the pattern $2 :" grep -i $2 $3 ;; # Delete all the lines matches with the pattern -d) echo "After deleting the lines matches with the pattern $2 :" sed -n "/$2/!p" $3 ;; *) echo "Invalid option" ;; esac
Spuštění výše uvedeného skriptu je zobrazeno níže.
$ cat text Vim is a text editor released by Bram Moolenaar in 1991 for the Amiga computer. The name "Vim" is an acronym for "Vi IMproved" because Vim was created as an extended version of the vi editor, with many additional features designed to be helpful in editing program source code. Although Vim was originally released for the Amiga, Vim has since been developed to be cross-platform, supporting many other platforms. It is the most popular editor amongst Linux Journal readers.
Bash case výstup regulárního výrazu. Po smazání řádků odpovídá vzoru Vim:
$ ./fileop.sh -d Vim text It is the most popular editor amongst Linux Journal readers.
Podívejte se také na náš dřívější článek o Bash ~ expansaion a { } expanzi.
Příklad případu Bash 3. Najděte typ souboru z rozšíření
Tento příklad vypíše typ souboru (text, Csource atd.) na základě přípony názvu souboru.
$ cat filetype.sh #!/bin/bash for filename in $(ls) do # Take extension available in a filename ext=${filename##*\.} case "$ext" in c) echo "$filename : C source file" ;; o) echo "$filename : Object file" ;; sh) echo "$filename : Shell script" ;; txt) echo "$filename : Text file" ;; *) echo " $filename : Not processed" ;; esac done $ ./filetype.sh a.c : C source file b.c : C source file c1.txt : Text file fileop.sh : Shell script obj.o : Object file text : Not processed t.o : Object file
Příklad případu Bash 4. Dotázat se uživatele s Ano nebo Ne
Při většině instalace softwaru se během licenční smlouvy zeptá uživatele na ano nebo ne. Následující fragment kódu je jedním ze způsobů, jak od uživatele získat ano nebo ne.
$ cat yorno.sh #!/bin/bash echo -n "Do you agree with this? [yes or no]: " read yno case $yno in [yY] | [yY][Ee][Ss] ) echo "Agreed" ;; [nN] | [n|N][O|o] ) echo "Not agreed, you can't proceed the installation"; exit 1 ;; *) echo "Invalid input" ;; esac $ ./yorno.sh Do you agree with this? [yes or no]: YES Agreed
Pokud existuje několik vzorů oddělených svislými znaky, výraz se může shodovat s kterýmkoli z nich, aby bylo možné spustit související příkazy. Vzory jsou kontrolovány v pořadí, dokud není nalezena shoda; pokud není žádný nalezen, nic se neděje.
Podívejte se také na náš dřívější článek s příklady 15 bashových polí.
Příklad případu Bash 5. Spouštěcí skript
Spouštěcí skripty v adresáři /etc/init.d používají ke spuštění a zastavení aplikace příkaz case.
Můžete použít jakýkoli druh vzorů, ale vždy se doporučuje použít příkaz case, když testujete na hodnotách primitiv. (tj. celá čísla nebo znaky).
$ cat startpcapp #!/bin/bash case "$1" in 'start') echo "Starting application" /usr/bin/startpc ;; 'stop') echo "Stopping application" /usr/bin/stoppc ;; 'restart') echo "Usage: $0 [start|stop]" ;; esac $ ./startpcapp start Starting application /usr/bin/startpc started
Doporučená četba
Bash 101 Hacks, od Rameshe Natarajan . Většinu času trávím v prostředí Linuxu. Takže jsem přirozeně velkým fanouškem Bash příkazového řádku a skriptování v shellu. Před 15 lety, když jsem pracoval na různých variantách *nix, jsem psal hodně kódu na C shellu a Korn shellu. Později, když jsem začal pracovat na Linuxu jako správce systému, jsem téměř automatizoval všechny možné úkoly pomocí skriptování v prostředí Bash. Na základě mých zkušeností s Bash jsem napsal e-knihu Bash 101 Hacks, která obsahuje 101 praktických příkladů jak pro příkazový řádek Bash, tak pro skriptování shellu. Pokud přemýšlíte o zvládnutí Bash, udělejte si laskavost a přečtěte si tuto knihu, která vám pomůže převzít kontrolu nad příkazovým řádkem Bash a skriptováním shellu.