به طور کلی، زمانهایی که بخواهیم اسکریپتی بنویسیم که شامل چندین دستور if و elif باشد، میبایست از دستور case استفاده کنیم چراکه استفاده از این دستور شامل مزایای زیر است:
- خواندن و نوشتن اینگونه دستورات راحت است.
- به مراتب بهتر از چندین دستور if و elif است.
- این امکان را به دولوپر میدهد تا مقدار یک متغیر را به یکباره با چند مقدار مختلف بسنجد.
- این دستور میزان پیچیدگی اسکریپت را کاهش میدهد.
همانطور که مشاهده میشود، ساختار اصولی یک دستور case در عکس فوق به تصویر کشیده شده است. اگر بخواهیم این ساختار را در قالب کد بررسی کنیم، میبایست کدهای زیر را در نظر بگیریم:
case $variable in
pattern-1)
commands
;;
pattern-2)
commands
;;
pattern-3|pattern-4|pattern-5)
commands
;;
pattern-N)
commands
;;
*)
commands
;;
esac
در تفسیر کدهای فوق بایستی گفت که متغیر variable$ ورودی دستور case است و pattern-2 ،pattern-1 الی آخر هم به منزلهٔ مقادیری هستند که قرار است متغیرمان با آنها سنجیده شود. همچنین در پایان هر کامند میبایست از علامت ;; استفاده کرد.
هشدار |
لازم به ذکر است که ۲ علامت ; میبایست بدون فاصله و به صورت چسبیده به هم تایپ شوند که در غیر این صورت با ارور مواجه خواهیم شد. |
دستور (* به عنوان دستور پیشفرض عمل میکند و اگر هیچ گزینهای اصطلاحاً Match نشود، این گزینه اجرا خواهد شد. دستور esac هم به منزلهٔ پایان دستور case است.
برای روشنتر شدن نحوهٔ کاربرد دستور case، فایلی ایجاد میکنیم تحت عنوان case.sh و کدهای زیر را داخل آن مینویسیم:
#! /bin/bash
echo "Please enter a letter:"
read character
case $character in
"a" | "A")
echo "You have typed a vowel!"
;;
"e" | "E")
echo "You have typed a vowel!"
;;
"i" | "I")
echo "You have typed a vowel!"
;;
"o" | "O")
echo "You have typed a vowel!"
;;
"u" | "U")
echo "You have typed a vowel!"
;;
*)
echo "You have typed a consonant!"
;;
esac
همانطور که مشخص است، در خط اول مسیر مفسر bash را داده ایم سپس در خط دوم با استفاده از دستور echo از کاربر میخواهیم که حرفی را وارد کند و حرف وارده شده را در متغیری تحت عنوان character ذخیره میسازیم.
در ادامه، دستور case را نوشته و یک علامت & به نام متغیر character اضافه کرده سپس کلیدواژهٔ in را مینویسیم که بدان معنا است که مقدار متغیر character$ در حالاتی که در ادامه میآیند میبایست چک شود.
به عنوان شرط اول، گفتهایم اگر حرف ورودی کاربری حرف a یا A بود، عبارت !You have typed a vowel به معنی «شما یک حرف صدادار وارد کردهاید!» چاپ شود. به همین منوال، سایر حروف صدادار (e ،i ،o و u) را در شروط بعدی آوردهایم و در نهایت هم از دستور (* استفاده کردهایم که به منزلهٔ شرط پیشفرض است که اگر هیچکدام از موارد فوق برابر با True نشد، این شرط اجرا گردد که دستور هم دادهایم تا عبارت !You have typed a consonant به معنی «شما یک حرف صامت تایپ کردهاید!» چاپ شود و در پایان هم با نوشتن دستور esac به این دستور case پایان میدهیم.
همانطور که پیش از این آموزش داده شد، ابتدا با استفاده از دستور chmod +x case.sh این فایل را قابلاجرا کرده سپس آنرا تست میکنیم:
bash case.sh
Please enter a letter:
a
You have typed a vowel!
برای تست اول، حرف a را تایپ کرده و اینتر میکنیم؛ میبینیم که شرط اول برقرار میگردد. حال یک بار دیگر این برنامه را اجرا کرده این بار حرفی همچون z را وارد میکنیم:
bash case.sh
Please enter a letter:
z
You have typed a consonant!
میبینیم از آنجا که هیچکدام از شروط در نظر گرفته شدهٔ دستور case برابر با True نشد، در نهایت دستور قرار گرفته پس از (* اجرا گردید.