Bash Scripting – Case Statement
En sagsfremstilling i bash scripts bruges, når en beslutning skal træffes mod flere valg. Det er med andre ord nyttigt, når et udtryk har mulighed for at have flere værdier. Denne metode kan ses som en erstatning for flere hvis-sætninger i et script. Sagsudsagn har en fordel i forhold til hvis-udsagn, fordi det forbedrer læsbarheden af vores kode, og de er nemmere at vedligeholde. Case-udsagn i et Bash-script minder ret meget om Case-udsagn på C-sprog. Men i modsætning til C, stopper Bash Case-erklæringen med at fortsætte søgningen, så snart matchen opstår. Med enkle ord kræver de ikke nogen pauseerklæring, der er obligatorisk at bruge i C for at stoppe med at søge efter et mønster yderligere.
Den grundlæggende syntaks for en case-sætning er angivet nedenfor,
Syntaks:
case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac
Sådan fungerer sagsfremstillingen:
-
EXPRESSION>er den variabel eller værdi, der evalueres i forhold til forskellige mønstre (cases) for at finde et match. - Sagsfremstillingen starter med nøgleordet
case>efterfulgt afEXPRESSION>skal vurderes. - Hvert tilfælde er defineret af en
Pattern_Case>der repræsenterer en bestemt værdi eller et bestemt mønster, der skal sammenlignes medEXPRESSION>. - Efter hver
Pattern_Case>, er der erklæringer, der skal udføres, hvisEXPRESSION>matcher det specifikkePattern_Case>. Disse udsagn er betegnet medSTATEMENTS>. - Det
;;>i slutningen af hverSTATEMENTS>blok angiver slutningen af en sagsblok. - Det
*)>er et specialtilfælde kendt som standardtilfældet. Hvis ingen af de foregående mønstre matcherEXPRESSION>, detSTATEMENTS>under*)>blok vil blive udført. - Det
esac>nøgleord markerer slutningen af sagsfremstillingen.
- Hvis intet mønster matches, er returstatus nul. Ellers er returstatus exitstatus for den udførte krop af den matchede mønstersag.
- Ligesom C angiver standardnøgleord til standardsætning, kan vi ligeledes i Bash-case-udsagnet bruge jokertegn-stjernesymbolet (*) og definere et endeligt mønster-case-bogstav for at definere standard-case- og bogstaverne.
Eksempel 1: Udskriv en beskrivelse for hver mulighed
I dette eksempel tillader et script brugeren at vælge en afdeling og viser en beskrivelse svarende til inputtet ved hjælp af en ekkokommando. I dette script har vi tildelt DEPARTMENT-variablen som Datalogi. Således bliver kroppen af den første mønstersag henrettet.
Du kan følge instruktionerne nedenfor:
1. Åbn terminalen (Ctrl + Alt + T), og opret scriptet:
department.sh
2. Føj disse udsagn til scriptet:
#!/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. Hver af linjerne er beskrevet nedenfor:
- Den første linje i scriptet starter med shebang (#!).
- Det instruerer operativsystemet til at bruge en bestemt fortolker til at parse scriptet.
- Vi har initialiseret en AFDELINGSvariabel som Datalogi.
- Nu bruger vi en sagserklæring.
- Hvert udtryk er blevet håndteret gennem sagsfremstillingen.
- Den sidste linje, esac, er brugt til at afslutte sagsfremstillingen.
4. Gem scriptet og gør det eksekverbart.
chmod +x department.sh
5. Kør scriptet.
./department.sh
Produktion:
Eksempel 2: Brug af flere mønstre tilfælde
I hver klausul kan vi bruge flere mønstertilfælde. Hvis udtrykket matcher med mindst én mønster-case, udføres kroppen af klausulen. I dette script har vi tildelt AFDELING-variablen som Elektronik og Kommunikation. Det tredje mønstercase har to værdier adskilt af røroperatoren ( | ). Således bliver kroppen af den tredje mønstersag henrettet.
Du kan følge instruktionerne nedenfor:
1. Åbn terminalen (Ctrl + Alt + T), og opret scriptet:
department.sh
2. Føj disse udsagn til scriptet:
#!/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. Hver af linjerne er blevet diskuteret nedenfor:
- Den første linje i scriptet starter med shebang (#!).
- Det instruerer operativsystemet til at bruge en bestemt fortolker til at parse scriptet.
- Vi har initialiseret en AFDELINGSvariabel som Elektronik og Kommunikation.
- Nu bruger vi en sagserklæring.
- Hvert udtryk er blevet håndteret gennem sagsfremstillingen.
- Den sidste linje, esac, er brugt til at afslutte sagsfremstillingen.
4. Gem scriptet og gør det eksekverbart.
chmod +x department.sh
5. Kør scriptet.
./department.sh
Produktion:
Eksempel 3: for Loops
I dette script har vi tildelt afdelingen for tre elever i en klasse i en array AFDELING. Med andre ord skal vi behandle mere end ét udtryk, der er beskrevet i AFDELING-variablen. For at iterere over flere udtryk kan vi bruge a for en løkke.
Du kan følge instruktionerne nedenfor:
1. Åbn terminalen (Ctrl + Alt + T), og opret scriptet:
department.sh
2. Føj disse udsagn til scriptet:
#!/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. Hver af linjerne er beskrevet nedenfor:
- Den første linje i scriptet starter med shebang (#!).
- Det instruerer operativsystemet til at bruge en bestemt fortolker til at parse scriptet.
- Vi har initialiseret en array DEPARTMENT med tre strenge bogstaver.
- Nu, ved hjælp af en for-loop, itererer vi over rækken af elementer.
- Hvert udtryk er blevet håndteret gennem sagsfremstillingen.
- Den sidste linje, esac, er brugt til at afslutte sagsfremstillingen.
4. Gem scriptet og gør det eksekverbart.
chmod +x department.sh
5. Kør scriptet.
./department.sh
Produktion:
Eksempel 4: Spørg brugeren med Ja eller Nej
Du kan følge instruktionerne nedenfor:
1. Åbn terminalen (Ctrl + Alt + T), og opret scriptet:
department.sh
2. Føj disse udsagn til scriptet:
#!/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. Hver af linjerne er forklaret nedenfor:
- Den første linje i scriptet starter med shebang (#!).
- Det instruerer operativsystemet til at bruge en bestemt fortolker til at parse scriptet.
- Brugeren bliver spurgt som Er du studerende? [Ja eller nej].
- Nu gives et svar fra brugeren via tastaturet.
- Outputtet af svaret er blevet håndteret gennem en sagsfremstilling.
- Den sidste linje, esac, er brugt til at afslutte sagsfremstillingen.
4. Gem scriptet og gør det eksekverbart.
chmod +x department.sh
5. Kør scriptet ved at bruge kommandoen nedenfor.
./department.sh
Produktion:
Eksempel 5: Sende signal til en proces
Du kan følge instruktionerne nedenfor:
1. Åbn terminalen (Ctrl + Alt + T), og opret scriptet:
signals.sh
2. Føj disse udsagn til scriptet:
#!/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. Hver af linjerne er forklaret nedenfor:
- $1 er signalnummeret og $2 er proces-id'et.
- For at sende eller sende et signal til det givne proces-id bruger vi kill-kommandoen.
- Dette vil køre sleep-kommandoen i et par sekunder.
- Brødteksten i den valgfri sidste sammenligning *) vil blive udført i standardtilfældet.
4. Gem scriptet.
5. Kør scriptet ved hjælp af kommandoen nedenfor.
./signals.sh
Produktion:
$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed
Eksempel 3: for Loops