Si të përdorni deklaratat e rastit në skriptet Bash
Deklaratat e rastit Bash janë të fuqishme por të lehta për t'u shkruar. Kur rivizitoni një skript të vjetër Linux, do të jeni të lumtur që keni përdorur një deklaratë rast
në vend të një deklarate të gjatë if-atëherë-else
.
Deklarata e rastit
Shumica e gjuhëve të programimit kanë versionin e tyre të një deklarate switch
ose rast
. Këto drejtojnë rrjedhën e ekzekutimit të programit sipas vlerës së një ndryshoreje. Në mënyrë tipike, ekziston një degë ekzekutimi e përcaktuar për secilën nga vlerat e pritshme të mundshme të ndryshores dhe një degë catch-all ose default për të gjitha vlerat e tjera.
Funksionaliteti logjik është i ngjashëm me një sekuencë të gjatë deklaratash if-then
me një deklaratë else
që kap gjithçka që nuk është trajtuar më parë nga një prej if
deklaratat.
Zbatimi i Bash i rastit
përpiqet të përputhet një shprehje me një nga klauzolat. Ai e bën këtë duke parë çdo klauzolë, nga ana tjetër, duke u përpjekur të gjejë një model që përputhet. Modelet në klauzola janë vargje, por - në mënyrë kundërintuitive - kjo nuk do të thotë që ne nuk mund të përdorim vlera numerike si shprehje.
Rasti Generic
Forma e përgjithshme e deklaratës rast
është kjo:
case expression in
pattern-1)
statement
;;
pattern-2)
statement
;;
.
.
.
pattern-N)
statement
;;
*)
statement
;;
esac
- Një deklaratë
rast
duhet të fillojë me fjalën kyçerast
dhe të përfundojë me fjalën kyçeesac
. - Shprehja vlerësohet dhe krahasohet me modelet në secilën klauzolë derisa të gjendet një përputhje.
- Deklarata ose deklaratat në klauzolën e përputhjes janë ekzekutuar.
- Një pikëpresje e dyfishtë
;;
përdoret për të përfunduar një klauzolë. - Nëse një model përputhet dhe deklaratat në atë klauzolë ekzekutohen, të gjitha modelet e tjera shpërfillen.
- Nuk ka kufi për numrin e klauzolave.
- Një yll
*
tregon modelin e paracaktuar. Nëse një shprehje nuk përputhet me ndonjë nga modelet e tjera në deklaratëncase
, ekzekutohet klauzola e paracaktuar.
Një shembull i thjeshtë
Ky skenar na tregon orët e hapjes për një dyqan imagjinar. Ai përdor komandën date
me vargun e formatit +\%a\
për të marrë emrin e shkurtuar të ditës. Kjo ruhet në variablin DayName
.
#!/bin/bash
DayName=$(date +"%a")
echo "Opening hours for $DayName"
case $DayName in
Mon)
echo "09:00 - 17:30"
;;
Tue)
echo "09:00 - 17:30"
;;
Wed)
echo "09:00 - 12:30"
;;
Thu)
echo "09:00 - 17:30"
;;
Fri)
echo "09:00 - 16:00"
;;
Sat)
echo "09:30 - 16:00"
;;
Sun)
echo "Closed all day"
;;
*)
;;
esac
Kopjojeni atë tekst në një redaktues dhe ruajeni si skedar të quajtur open.sh.
Ne do të duhet të përdorim komandën chmod
për ta bërë atë të ekzekutueshme. Ju do të duhet ta bëni këtë për të gjitha skriptet që krijoni ndërsa punoni me këtë artikull.
chmod +x open.sh
Tani mund të ekzekutojmë skenarin tonë.
./open.sh
Dita kur është marrë pamja e ekranit ndodh të jetë e premte. Kjo do të thotë se variabli DayName
mban vargun Premte. Kjo përputhet me modelin Fri të klauzolës Fri).
Vini re se modelet në klauzola nuk kanë nevojë të mbështillen me thonjëza të dyfishta, por nuk bën ndonjë dëm nëse janë. Megjithatë, ju duhet të përdorni thonjëza të dyfishta nëse modeli përmban hapësira.
Klauzola e paracaktuar është lënë bosh. Çdo gjë që nuk përputhet me një nga klauzolat e mëparshme shpërfillet.
Ai skenar funksionon dhe lexohet lehtë, por është i gjatë dhe i përsëritur. Ne mund ta shkurtojmë atë lloj deklarate rast
me lehtësi.
Përdorimi i modeleve të shumëfishta në një klauzolë
Një veçori vërtet e pastër e deklaratave rast
është se ju mund të përdorni modele të shumta në secilën klauzolë. Nëse shprehja përputhet me ndonjë nga ato modele, deklaratat në atë klauzolë ekzekutohen.
Këtu është një skenar që ju tregon sa ditë ka në një muaj. Mund të ketë vetëm tre përgjigje: 30 ditë, 31 ditë, ose 28 ose 29 ditë për shkurt. Pra, edhe pse janë 12 muaj, na duhen vetëm tre klauzola.
Në këtë skript, përdoruesit i kërkohet emri i një muaji. Për ta bërë të pandjeshme rastin e përputhjes së modelit, ne përdorim komandën shopt
me opsionin -s nocasematch
. Nuk ka rëndësi nëse hyrja përmban shkronja të mëdha, të vogla ose një përzierje të të dyjave.
#!/bin/bash
shopt -s nocasematch
echo "Enter name of a month"
read month
case $month in
February)
echo "28/29 days in $month"
;;
April | June | September | November)
echo "30 days in $month"
;;
January | March | May | July | August | October | December)
echo "31 days in $month"
;;
*)
echo "Unknown month: $month"
;;
esac
Shkurti merr një klauzolë për vete, dhe të gjithë muajt e tjerë ndajnë dy klauzola sipas nëse kanë 30 apo 31 ditë në to. Klauzolat me shumë modele përdorin simbolin e tubit | si ndarës. Rasti i paracaktuar kap muajt e shkruar keq.
Ne e ruajtëm këtë në një skedar të quajtur month.sh dhe e bëmë të ekzekutueshme.
chmod +x month.sh
Do ta ekzekutojmë skriptin disa herë dhe do të tregojmë se nuk ka rëndësi nëse përdorim shkronja të mëdha apo të vogla.
./month.sh
Sepse i thamë shkrimit të injorojë dallimet në shkronja të mëdha dhe të vogla, çdo emër muaji i shkruar saktë trajtohet nga një nga tre klauzolat kryesore. Muajt e shkruar keq kapen nga klauzola e paracaktuar.
Përdorimi i shifrave në deklaratat e rastit
Mund të përdorim edhe shifra ose ndryshore numerike si shprehje. Ky skript i kërkon përdoruesit të fusë një numër në intervalin 1..3. Për ta bërë të qartë se modelet në çdo klauzolë janë vargje, ato janë mbështjellë me thonjëza të dyfishta. Pavarësisht kësaj, skripti ende përputhet me hyrjen e përdoruesit me klauzolën e duhur.
#!/bin/bash
echo "Enter 1, 2, or 3: "
read Number
case $Number in
"1")
echo "Clause 1 matched"
;;
"2")
echo "Clause 2 matched"
;;
"3")
echo "Clause 3 matched"
;;
*)
echo "Default clause matched"
;;
esac
Ruajeni këtë në një skedar të quajtur number.sh, bëjeni të ekzekutueshëm dhe më pas ekzekutojeni:
./number.sh
Përdorimi i deklaratave të rasteve në për sythe
Një deklaratë rast
përpiqet të përputhet me një shprehje të vetme. Nëse keni shumë shprehje për të përpunuar, mund ta vendosni deklaratën rast
brenda një cikli for
.
Ky skript ekzekuton komandën ls
për të marrë një listë skedarësh. Në ciklin for
, globbing-i i skedarit - i ngjashëm por i ndryshëm nga shprehjet e rregullta - zbatohet në çdo skedar me radhë për të nxjerrë shtesën e skedarit. Kjo ruhet në variablin e vargut Extension
.
Deklarata rast
përdor variablin Extension
si shprehjen që përpiqet të përputhet me një klauzolë.
#!/bin/bash
for File in $(ls)
do
# extract the file extension
Extension=${File##*.}
case "$Extension" in
sh)
echo " Shell script: $File"
;;
md)
echo " Markdown file: $File"
;;
png)
echo "PNG image file: $File"
;;
*)
echo "Unknown: $File"
;;
esac
done
Ruajeni këtë tekst në një skedar të quajtur filetype.sh, bëjeni të ekzekutueshëm dhe më pas ekzekutojeni duke përdorur:
./filetype.sh
Skripti ynë minimalist i identifikimit të llojit të skedarit funksionon.
Trajtimi i kodeve të daljes me deklarata të rasteve
Një program me sjellje të mirë do të dërgojë një kod daljeje në guaskë kur të përfundojë. Skema konvencionale përdor vlerën e kodit të daljes zero për të treguar një ekzekutim pa probleme dhe vlerat e një ose më shumë për të treguar lloje të ndryshme gabimesh.
Shumë programe përdorin vetëm zero dhe një. Grumbullimi i të gjitha kushteve të gabimit në një kod të vetëm daljeje e bën më të vështirë identifikimin e problemeve, por është praktikë e zakonshme.
Ne krijuam një program të vogël të quajtur go-geek që do të kthente rastësisht kodet e daljes zero ose një. Ky skenar tjetër thërret go-geek
. Ai merr kodin e daljes duke përdorur variablin e guaskës $?
dhe e përdor atë si shprehje për deklaratën case
.
Një skript i botës reale do të bënte përpunimin e duhur sipas suksesit ose dështimit të komandës që gjeneroi kodin e daljes.
#!/bin/bash
go-geek
case $? in
"0")
echo "Response was: Success"
echo "Do appropriate processing in here"
;;
"1")
echo "Response was: Error"
echo "Do appropriate error handling in here"
;;
*)
echo "Unrecognised response: $?"
;;
esac
Ruajeni këtë në një skript të quajtur return-code.sh dhe bëjeni të ekzekutueshëm. Ju do të duhet të zëvendësoni një komandë tjetër për komandën tonë go-geek
. Mund të provoni të futni cd
në një drejtori që nuk ekziston për të marrë një kod daljeje prej një, dhe më pas të modifikoni skriptin tuaj në cd
në një drejtori të aksesueshme për të marrë një dalje kodi zero.
Ekzekutimi i skriptit disa herë tregon se kodet e ndryshme të daljes janë identifikuar saktë nga deklarata case
.
./return-code.sh
Lexueshmëria ndihmon mirëmbajtjen
Kthimi te skriptet e vjetra të Bash-it dhe për të kuptuar se si e bëjnë atë që bëjnë, veçanërisht nëse janë shkruar nga dikush tjetër, është sfiduese. Ndryshimi i funksionalitetit të skripteve të vjetra është edhe më i vështirë.
Deklarata case
ju jep logjikë degëzimi me sintaksë të qartë dhe të lehtë. Kjo është një fitore e favorshme.