Bash Scripting – Case Statement
Izjava o primeru v skriptih bash se uporablja, ko je treba sprejeti odločitev proti več možnostim. Z drugimi besedami, uporabno je, če ima izraz možnost več vrednosti. To metodologijo lahko razumemo kot zamenjavo za več stavkov if v skriptu. Stavki primerov imajo prednost pred stavki if, ker izboljšajo berljivost naše kode in jih je lažje vzdrževati. Stavki Case v skriptu Bash so precej podobni stavkom Case v jeziku C. Toda za razliko od C stavek Bash Case preneha nadaljevati iskanje takoj, ko pride do ujemanja. Preprosto povedano, ne potrebujejo nobenega stavka za prekinitev, ki je obvezen za uporabo v C, da bi prenehali iskati vzorec.
Osnovna sintaksa stavka case je podana spodaj,
Sintaksa:
case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac
Izjava o primeru deluje tako:
-
EXPRESSION>je spremenljivka ali vrednost, ki se ovrednoti glede na različne vzorce (primere), da se najde ujemanje. - Stavek primera se začne s ključno besedo
case>slediEXPRESSION>da se oceni. - Vsak primer je opredeljen z a
Pattern_Case>ki predstavlja določeno vrednost ali vzorec, ki ga je treba primerjati zEXPRESSION>. - Po vsakem
Pattern_Case>, obstajajo stavke, ki jih je treba izvršiti, čeEXPRESSION>ujema s posebnimPattern_Case>. Te izjave so označene zSTATEMENTS>. - The
;;>na koncu vsakegaSTATEMENTS>blok označuje konec bloka primerov. - The
*)>je poseben primer, znan kot privzeti primer. Če se nobeden od prejšnjih vzorcev ne ujema zEXPRESSION>, theSTATEMENTS>pod*)>blok bo izveden. - The
esac>ključna beseda označuje konec izjave primera.
- Če se vzorec ne ujema, je status vračila nič. V nasprotnem primeru je status vrnitve izhodni status izvedenega telesa primera ujemajočega se vzorca.
- Tako kot C zagotavlja privzeto ključno besedo za privzeti stavek, lahko tudi v stavku Bash case uporabimo nadomestni znak zvezdice (*) in definiramo končni vzorec primera, da definiramo privzeti primer.
1. primer: izpišite opis za vsako možnost
V tem primeru skript omogoča uporabniku, da izbere oddelek in prikaže opis, ki ustreza vnosu s pomočjo ukaza echo. V tem skriptu smo spremenljivki DEPARTMENT dodelili Računalništvo. Tako se izvede telo prvega primera vzorca.
Sledite lahko spodnjim navodilom:
1. Odprite terminal (Ctrl + Alt + T) in ustvarite skript:
department.sh
2. Skriptu dodajte te izjave:
#!/bin/bash DEPARTMENT='Computer Science' echo -n 'Your DEPARTMENT is ' case $DEPARTMENT in 'Computer Science') echo -n 'Computer Science' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication' ;; *) echo -n 'Invalid' ;; esac
3. Vsaka od vrstic je opisana spodaj:
- Prva vrstica v scenariju se začne s shebangom (#!).
- Operacijskemu sistemu naroči, naj za razčlenitev skripta uporabi določen tolmač.
- Inicializirali smo spremenljivko DEPARTMENT kot Computer Science.
- Zdaj uporabljamo izjavo primera.
- Vsak izraz je bil obravnavan prek izjave case.
- Zadnja vrstica, esac, je bila uporabljena za zaključek stavka case.
4. Shranite skript in ga naredite izvršljivega.
chmod +x department.sh
5. Zaženite skript.
./department.sh
Izhod:
Primer 2: Uporaba primerov z več vzorci
V vsakem členu lahko uporabimo več primerov vzorcev. Če se izraz ujema z vsaj enim vzorčnim primerom, se telo klavzule izvede. V tem skriptu smo spremenljivki DEPARTMENT dodelili Electronics and Communication. Tretji primer vzorca ima dve vrednosti, ločeni z navpično črto ( | ). Tako se izvede telo tretjega primera vzorca.
Sledite lahko spodnjim navodilom:
1. Odprite terminal (Ctrl + Alt + T) in ustvarite skript:
department.sh
2. Skriptu dodajte te izjave:
#!/bin/bash DEPARTMENT='Electronics and Communication' echo -n 'Your DEPARTMENT is ' case $DEPARTMENT in 'Computer Science') echo -n 'Computer Science' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication' ;; *) echo -n 'Invalid' ;; esac
3. Vsaka od vrstic je bila obravnavana spodaj:
- Prva vrstica v scenariju se začne s shebangom (#!).
- Operacijskemu sistemu naroči, naj za razčlenitev skripta uporabi določen tolmač.
- Inicializirali smo spremenljivko DEPARTMENT kot Electronics and Communication.
- Zdaj uporabljamo izjavo primera.
- Vsak izraz je bil obravnavan prek izjave case.
- Zadnja vrstica, esac, je bila uporabljena za zaključek stavka case.
4. Shranite skript in ga naredite izvršljivega.
chmod +x department.sh
5. Zaženite skript.
./department.sh
Izhod:
Primer 3: za zanke
V tem skriptu smo oddelku dodelili tri učence razreda v nizu DEPARTMENT. Z drugimi besedami, obdelali bomo več kot en izraz, ki je opisan v spremenljivki DEPARTMENT. Za ponavljanje več izrazov lahko uporabimo zanko for.
Sledite lahko spodnjim navodilom:
1. Odprite terminal (Ctrl + Alt + T) in ustvarite skript:
department.sh
2. Skriptu dodajte te izjave:
#!/bin/bash DEPARTMENT=('Electronics and Communication' 'Computer Science' 'Information Technology') for value in '${DEPARTMENT[@]}' do case $value in 'Computer Science') echo -n 'Computer Science ' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering ' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication ' ;; *) echo -n 'Invalid ' ;; esac done 3. Vsaka od vrstic je opisana spodaj:
- Prva vrstica v scenariju se začne s shebangom (#!).
- Operacijskemu sistemu naroči, naj za razčlenitev skripta uporabi določen tolmač.
- Inicializirali smo matriko DEPARTMENT s tremi nizovnimi literali.
- Zdaj s pomočjo for-zanke ponavljamo po nizu elementov.
- Vsak izraz je bil obravnavan prek izjave case.
- Zadnja vrstica, esac, je bila uporabljena za zaključek stavka case.
4. Shranite skript in ga naredite izvršljivega.
chmod +x department.sh
5. Zaženite skript.
./department.sh
Izhod:
Primer 4: Poziv uporabniku z Da ali Ne
Sledite lahko spodnjim navodilom:
1. Odprite terminal (Ctrl + Alt + T) in ustvarite skript:
department.sh
2. Skriptu dodajte te izjave:
#!/bin/bash echo -n 'Are you a student? [yes or no]: ' read response case $response in 'Y' | 'y' | 'YES' | 'Yes' | 'yes') echo -n 'Yes, I am a student.' ;; 'N' | 'n' | 'No' | 'NO' | 'no' | 'nO') echo -n 'No, I am not a student.'; ;; *) echo -n 'Invalid input' ;; esac
3. Vsaka od vrstic je razložena spodaj:
- Prva vrstica v scenariju se začne s shebangom (#!).
- Operacijskemu sistemu naroči, naj za razčlenitev skripta uporabi določen tolmač.
- Uporabnik se vpraša Ali ste študent? [ja ali ne].
- Zdaj uporabnik poda odgovor prek tipkovnice.
- Rezultat odgovora je bil obdelan prek izjave o primeru.
- Zadnja vrstica, esac, je bila uporabljena za zaključek stavka case.
4. Shranite skript in ga naredite izvršljivega.
chmod +x department.sh
5. Zaženite skript z uporabo spodnjega ukaza.
./department.sh
Izhod:
Primer 5: Pošiljanje signala procesu
Sledite lahko spodnjim navodilom:
1. Odprite terminal (Ctrl + Alt + T) in ustvarite skript:
signals.sh
2. Skriptu dodajte te izjave:
#!/bin/bash if [ $# -lt 2 ] then echo 'Usage : $0 Signalnumber PID' exit fi # Case statement # Signal number (expression) 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 ;; 4) echo 'Sending SIGKILL signals.....' kill -SIGKILL $2 ;; *) echo 'Signal number $1 has not been processed' ;; esac
3. Vsaka od vrstic je razložena spodaj:
- $1 je številka signala in $2 je ID procesa.
- Za posredovanje ali pošiljanje signala danemu ID-ju procesa uporabimo ukaz kill.
- To bo zagnalo ukaz za spanje za nekaj sekund.
- Telo neobvezne zadnje primerjave *) bo izvedeno v privzetem primeru.
4. Shranite skript.
5. Zaženite skript z uporabo spodnjega ukaza.
./signals.sh
Izhod:
$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed
Primer 3: za zanke