case хуваарилагч
Нэг хувьсагчийн утгыг олон боломжтой утгатай харьцуулах хэрэгцээ байнга гардаг. Энэ тохиолдолд урт if/elif/elif/else гинж бичихийн оронд case хуваарилагчийг ашиглавал код хавьгүй цэвэр, уншихад хялбар болдог. case нь JavaScript болон Python-н switch-тэй адил санаа.
case — Үндсэн бүтэц
case утга in
загвар1)
# загвар1 тохирвол ажиллана
;;
загвар2)
# загвар2 тохирвол ажиллана
;;
*)
# ямар ч загвар тохироогүй — анхдагч
;;
esac
;; нь тухайн блокийн төгсгөл, esac нь case-г эргүүлж уншсан үг — блокийг хаадаг. Энгийн жишээ:
#!/bin/bash
read -p "Гараг оруулна уу (mon/tue/wed/thu/fri): " day
case $day in
mon)
echo "Даваа — Долоо хоногийн эхлэл!"
;;
tue|wed|thu)
echo "Ажлын дундын өдрүүд"
;;
fri)
echo "Баасан — Амралт ойрхон!"
;;
sat|sun)
echo "Амралтын өдөр"
;;
*)
echo "Буруу оролт: $day"
;;
esac
tue|wed|thu нь "tue эсвэл wed эсвэл thu" гэсэн утгатай — | тэмдэгтээр олон загварыг нэг блокт нийлүүлнэ.
Wildcard загвар
case нь glob wildcard ашигладаг тул уян хатан загвар бичиж болно:
#!/bin/bash
read -p "Файлын нэр: " filename
case $filename in
*.sh)
echo "Bash script файл"
;;
*.txt | *.md)
echo "Текст файл"
;;
*.jpg | *.png | *.gif)
echo "Зургийн файл"
;;
*.tar.gz | *.zip)
echo "Архив файл"
;;
*)
echo "Тодорхойгүй төрлийн файл"
;;
esac
* нь ямар ч тооны ямар ч тэмдэгттэй тохирно. *.sh нь .sh-ээр төгсдөг аливаа нэртэй тохирно.
Цэсний систем бүтээх
case нь командын мөрийн цэс (menu) бүтээхэд маш тохиромжтой:
#!/bin/bash
echo "==========================="
echo " Файл менежер — v1.0"
echo "==========================="
echo "1) Файлуудыг жагсаах"
echo "2) Шинэ директор үүсгэх"
echo "3) Одоогийн байршил харах"
echo "4) Гарах"
echo "---------------------------"
read -p "Сонголт (1-4): " choice
case $choice in
1)
ls -lh
;;
2)
read -p "Директорын нэр: " dirname
mkdir -p "$dirname"
echo "'$dirname' директор үүсгэлээ."
;;
3)
pwd
;;
4)
echo "Гарлаа. Баяртай!"
exit 0
;;
*)
echo "Буруу сонголт. 1-4 тоо оруулна уу."
;;
esac
if/elif vs case — Хэзээ алийг ашиглах вэ?
# if/elif — нөхцөл нь нарийн тооцоолол шаардвал тохиромжтой
if [ $age -lt 13 ]; then
echo "Хүүхэд"
elif [ $age -lt 18 ]; then
echo "Өсвөр насны"
else
echo "Насанд хүрсэн"
fi
# case — нэг утгыг тодорхой загвартай харьцуулах тохиолдолд цэвэрхэн
case $role in
admin) echo "Администратор" ;;
editor) echo "Редактор" ;;
viewer) echo "Үзэгч" ;;
*) echo "Тодорхойгүй эрх" ;;
esac
Тоон харьцуулалт, -gt, -lt зэрэг шаардлагатай бол if/elif, нэг утгыг тогтмол загваруудтай харьцуулах бол case ашиглах нь зөв сонголт.
Дараагийн хичээлд:
for давталт — жагсаалт, файлууд, тоонуудыг давтан боловсруулах хамгийн түгээмэл бүтцийг сурна.