logo

Bash Scripting – Declarație de caz

O declarație de caz în scripturile bash este utilizat atunci când trebuie luată o decizie împotriva alegerilor multiple. Cu alte cuvinte, este util atunci când o expresie are posibilitatea de a avea mai multe valori. Această metodologie poate fi văzută ca un înlocuitor pentru mai multe instrucțiuni if ​​dintr-un script. Declarațiile Case au un avantaj față de instrucțiunile if, deoarece îmbunătățesc lizibilitatea codului nostru și sunt mai ușor de întreținut. Declarațiile Case într-un script Bash sunt destul de asemănătoare cu instrucțiunile Case în limbajul C. Dar, spre deosebire de C, instrucțiunea Bash Case oprește continuarea căutării de îndată ce apare potrivirea. Cu cuvinte simple, nu necesită nicio instrucțiune de pauză care este obligatorie pentru a fi folosită în C pentru a opri căutarea unui model în continuare.

Sintaxa de bază a unei declarații case este dată mai jos,

Sintaxă:



case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac>

Iată cum funcționează declarația de caz:

  • EXPRESSION>este variabila sau valoarea care este evaluată în funcție de diferite modele (cazuri) pentru a găsi o potrivire.
  • Declarația case începe cu cuvântul cheiecase>urmată deEXPRESSION>pentru a fi evaluat.
  • Fiecare caz este definit de aPattern_Case>care reprezintă o valoare sau un model specific care trebuie comparat cuEXPRESSION>.
  • După fiecarePattern_Case>, există instrucțiuni care trebuie executate dacăEXPRESSION>se potrivește cu specificulPattern_Case>. Aceste afirmații sunt notate cuSTATEMENTS>.
  • The;;>la sfarsitul fiecaruiaSTATEMENTS>bloc indică sfârșitul unui bloc de caz.
  • The*)>este un caz special cunoscut sub numele de cazul implicit. Dacă niciunul dintre modelele anterioare nu se potriveșteEXPRESSION>, celSTATEMENTS>sub*)>blocul va fi executat.
  • Theesac>cuvântul cheie marchează sfârșitul declarației case.
  • În cazul în care nu se potrivește niciun model, starea de returnare este zero. În caz contrar, starea de returnare este starea de ieșire a corpului executat al cazului de model potrivit.
  • La fel ca C furnizează cuvântul cheie implicit pentru declarația implicită, la fel și în instrucțiunea Bash case, putem folosi simbolul asterisc (*) și definim un model final pentru a defini cazul implicit.

Exemplul 1: Afișați o descriere pentru fiecare opțiune

În acest exemplu, un script permite utilizatorului să selecteze un departament și arată o descriere corespunzătoare intrării cu ajutorul unei comenzi echo. În acest script, am atribuit variabila DEPARTAMENT ca Informatică. Astfel, corpul primului caz de tipar este executat.

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

listnode
#!/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. Fiecare dintre linii este descrisă mai jos:

  • Prima linie din script începe cu shebang (#!).
  • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Am inițializat o variabilă DEPARTMENT ca Informatică.
  • Acum, folosim o declarație de caz.
  • Fiecare expresie a fost gestionată prin declarația case.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul.

./department.sh>

Ieșire:

406

Exemplul 2: Utilizarea cazurilor cu modele multiple

În fiecare clauză, putem folosi mai multe cazuri de tipar. Dacă expresia se potrivește cu cel puțin un model, atunci corpul clauzei este executat. În acest script, am atribuit variabila DEPARTAMENT ca Electronică și Comunicare. Al treilea caz model are două valori separate de operatorul pipe ( | ). Astfel, corpul celui de-al treilea caz de tipar este executat.

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre rânduri a fost discutată mai jos:

  • Prima linie din script începe cu shebang (#!).
  • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Am inițializat o variabilă DEPARTMENT ca Electronică și Comunicații.
  • Acum, folosim o declarație de caz.
  • Fiecare expresie a fost gestionată prin declarația case.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul.

./department.sh>

Ieșire:

407 Exemplul 3: for Loops

În acest script, am alocat departamentul a trei elevi ai unei clase într-o matrice DEPARTAMENT. Cu alte cuvinte, vom procesa mai mult de o expresie care este descrisă în variabila DEPARTMENT. Pentru a itera peste mai multe expresii, putem folosi o buclă for.

Puteți urma instrucțiunile de mai jos:

stlc

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre linii este descrisă mai jos:

  • Prima linie din script începe cu shebang (#!).
  • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Am inițializat un tablou DEPARTMENT cu trei literale șir.
  • Acum, cu ajutorul unei bucle for, iterăm peste matricea de elemente.
  • Fiecare expresie a fost gestionată prin declarația case.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul.

./department.sh>

Ieșire:

408

Exemplul 4: Solicitați utilizatorului cu Da sau Nu

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre rânduri este explicată mai jos:

  • Prima linie din script începe cu shebang (#!).
    • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Utilizatorului i se solicită mesajul Ești student? [da sau nu].
  • Acum un răspuns este dat de utilizator prin tastatură.
  • Ieșirea răspunsului a fost gestionată printr-o declarație de caz.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul utilizând comanda de mai jos.

string.format java string
./department.sh>

Ieșire:

409

Exemplul 5: Trimiterea unui semnal către un proces

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

signals.sh>

2. Adăugați aceste instrucțiuni la script:

#!/bin/bash if [ $# -lt 2 ] then echo 'Usage : 

O declarație de caz în scripturile bash este utilizat atunci când trebuie luată o decizie împotriva alegerilor multiple. Cu alte cuvinte, este util atunci când o expresie are posibilitatea de a avea mai multe valori. Această metodologie poate fi văzută ca un înlocuitor pentru mai multe instrucțiuni if ​​dintr-un script. Declarațiile Case au un avantaj față de instrucțiunile if, deoarece îmbunătățesc lizibilitatea codului nostru și sunt mai ușor de întreținut. Declarațiile Case într-un script Bash sunt destul de asemănătoare cu instrucțiunile Case în limbajul C. Dar, spre deosebire de C, instrucțiunea Bash Case oprește continuarea căutării de îndată ce apare potrivirea. Cu cuvinte simple, nu necesită nicio instrucțiune de pauză care este obligatorie pentru a fi folosită în C pentru a opri căutarea unui model în continuare.

Sintaxa de bază a unei declarații case este dată mai jos,

Sintaxă:

case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac>

Iată cum funcționează declarația de caz:

  • EXPRESSION>este variabila sau valoarea care este evaluată în funcție de diferite modele (cazuri) pentru a găsi o potrivire.
  • Declarația case începe cu cuvântul cheiecase>urmată deEXPRESSION>pentru a fi evaluat.
  • Fiecare caz este definit de aPattern_Case>care reprezintă o valoare sau un model specific care trebuie comparat cuEXPRESSION>.
  • După fiecarePattern_Case>, există instrucțiuni care trebuie executate dacăEXPRESSION>se potrivește cu specificulPattern_Case>. Aceste afirmații sunt notate cuSTATEMENTS>.
  • The;;>la sfarsitul fiecaruiaSTATEMENTS>bloc indică sfârșitul unui bloc de caz.
  • The*)>este un caz special cunoscut sub numele de cazul implicit. Dacă niciunul dintre modelele anterioare nu se potriveșteEXPRESSION>, celSTATEMENTS>sub*)>blocul va fi executat.
  • Theesac>cuvântul cheie marchează sfârșitul declarației case.
  • În cazul în care nu se potrivește niciun model, starea de returnare este zero. În caz contrar, starea de returnare este starea de ieșire a corpului executat al cazului de model potrivit.
  • La fel ca C furnizează cuvântul cheie implicit pentru declarația implicită, la fel și în instrucțiunea Bash case, putem folosi simbolul asterisc (*) și definim un model final pentru a defini cazul implicit.

Exemplul 1: Afișați o descriere pentru fiecare opțiune

În acest exemplu, un script permite utilizatorului să selecteze un departament și arată o descriere corespunzătoare intrării cu ajutorul unei comenzi echo. În acest script, am atribuit variabila DEPARTAMENT ca Informatică. Astfel, corpul primului caz de tipar este executat.

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre linii este descrisă mai jos:

  • Prima linie din script începe cu shebang (#!).
  • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Am inițializat o variabilă DEPARTMENT ca Informatică.
  • Acum, folosim o declarație de caz.
  • Fiecare expresie a fost gestionată prin declarația case.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul.

./department.sh>

Ieșire:

406

Exemplul 2: Utilizarea cazurilor cu modele multiple

În fiecare clauză, putem folosi mai multe cazuri de tipar. Dacă expresia se potrivește cu cel puțin un model, atunci corpul clauzei este executat. În acest script, am atribuit variabila DEPARTAMENT ca Electronică și Comunicare. Al treilea caz model are două valori separate de operatorul pipe ( | ). Astfel, corpul celui de-al treilea caz de tipar este executat.

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre rânduri a fost discutată mai jos:

  • Prima linie din script începe cu shebang (#!).
  • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Am inițializat o variabilă DEPARTMENT ca Electronică și Comunicații.
  • Acum, folosim o declarație de caz.
  • Fiecare expresie a fost gestionată prin declarația case.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul.

./department.sh>

Ieșire:

407 Exemplul 3: for Loops

În acest script, am alocat departamentul a trei elevi ai unei clase într-o matrice DEPARTAMENT. Cu alte cuvinte, vom procesa mai mult de o expresie care este descrisă în variabila DEPARTMENT. Pentru a itera peste mai multe expresii, putem folosi o buclă for.

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre linii este descrisă mai jos:

  • Prima linie din script începe cu shebang (#!).
  • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Am inițializat un tablou DEPARTMENT cu trei literale șir.
  • Acum, cu ajutorul unei bucle for, iterăm peste matricea de elemente.
  • Fiecare expresie a fost gestionată prin declarația case.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul.

./department.sh>

Ieșire:

408

Exemplul 4: Solicitați utilizatorului cu Da sau Nu

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

department.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre rânduri este explicată mai jos:

  • Prima linie din script începe cu shebang (#!).
    • Acesta instruiește sistemul de operare să folosească un anumit interpret pentru a analiza scriptul.
  • Utilizatorului i se solicită mesajul Ești student? [da sau nu].
  • Acum un răspuns este dat de utilizator prin tastatură.
  • Ieșirea răspunsului a fost gestionată printr-o declarație de caz.
  • Ultima linie, esac, a fost folosită pentru a termina declarația de caz.

4. Salvați scriptul și faceți-l executabil.

chmod +x department.sh>

5. Rulați scriptul utilizând comanda de mai jos.

./department.sh>

Ieșire:

409

Exemplul 5: Trimiterea unui semnal către un proces

Puteți urma instrucțiunile de mai jos:

1. Deschideți terminalul (Ctrl + Alt + T) și creați scriptul:

signals.sh>

2. Adăugați aceste instrucțiuni la script:

#!/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. Fiecare dintre rânduri este explicată mai jos:

  • $1 este numărul semnalului și $2 este id-ul procesului.
  • Pentru a transmite sau trimite un semnal către id-ul de proces dat, folosim comanda kill.
  • Aceasta va rula comanda de repaus pentru câteva secunde.
  • Corpul ultimei comparații opționale *) va fi executat în cazul implicit.

4. Salvați scriptul.

5. Rulați scriptul utilizând comanda de mai jos.

./signals.sh>

Ieșire:

$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed>


Signalnumber PID' exit fi # Case statement # Signal number (expression) case '' in 1) echo 'Sending SIGHUP signal.....' kill -SIGHUP ;; 2) echo 'Sending SIGINT signal.....' kill -SIGINT ;; 3) echo 'Sending SIGQUIT signal.....' kill -SIGQUIT ;; 4) echo 'Sending SIGKILL signals.....' kill -SIGKILL ;; *) echo 'Signal number has not been processed' ;; esac>

3. Fiecare dintre rânduri este explicată mai jos:

  • este numărul semnalului și este id-ul procesului.
  • Pentru a transmite sau trimite un semnal către id-ul de proces dat, folosim comanda kill.
  • Aceasta va rula comanda de repaus pentru câteva secunde.
  • Corpul ultimei comparații opționale *) va fi executat în cazul implicit.

4. Salvați scriptul.

5. Rulați scriptul utilizând comanda de mai jos.

./signals.sh>

Ieșire:

$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed>