Bash / case хуваарилагч

case хуваарилагч

Нэг хувьсагчийн утгыг олон боломжтой утгатай харьцуулах хэрэгцээ байнга гардаг. Энэ тохиолдолд урт if/elif/elif/else гинж бичихийн оронд case хуваарилагчийг ашиглавал код хавьгүй цэвэр, уншихад хялбар болдог. case нь JavaScript болон Python-н switch-тэй адил санаа.

case — Үндсэн бүтэц

bash
case утга in
    загвар1)
        # загвар1 тохирвол ажиллана
        ;;
    загвар2)
        # загвар2 тохирвол ажиллана
        ;;
    *)
        # ямар ч загвар тохироогүй — анхдагч
        ;;
esac

;; нь тухайн блокийн төгсгөл, esac нь case-г эргүүлж уншсан үг — блокийг хаадаг. Энгийн жишээ:

bash
#!/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 ашигладаг тул уян хатан загвар бичиж болно:

bash
#!/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) бүтээхэд маш тохиромжтой:

bash
#!/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 — Хэзээ алийг ашиглах вэ?

bash
# 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 давталт — жагсаалт, файлууд, тоонуудыг давтан боловсруулах хамгийн түгээмэл бүтцийг сурна.