bash ไวยากรณ์ของเคสที่ซ้อนกันและ ;; จุดสิ้นสุด


14

ฉันมีเทอร์มิเนเตอร์เพียงพอ (หรืออาจจะมากเกินไป) ;;ในสคริปต์ทุบตีนี้ที่มีซ้อนอยู่caseหรือไม่?

case "$1" in
OK)
    # Nothing needs done
    echo -n "OK:1" ;;

CRITICAL)

    case "$2" in
    SOFT)
        case "$3" in
        1|2) 
            soft_reset_pool.sh ;;
        esac ;;

    HARD)
        case "$3" in
        1|2)
            hard_reset_pool.sh ;;

        3|4)
            hard_reset_service ;;

        esac ;;
    esac ;;      
esac

ไม่กี่ปีมานี้ที่ฉันโกรธมาก ๆ

คำตอบ:


36

มันง่ายที่จะติดตามถ้าคุณใช้เยื้องเหมาะสมใน;;s

case "$1" in
OK)
    # Nothing needs done
    echo -n "OK:1"
    ;;

CRITICAL)

    case "$2" in
    SOFT)
        case "$3" in
        1|2) 
            soft_reset_pool.sh
            ;;
        esac
        ;;

    HARD)
        case "$3" in
        1|2)
            hard_reset_pool.sh
            ;;

        3|4)
            hard_reset_service
            ;;

        esac
        ;;
    esac
    ;;
esac

มันเข้ากันได้ดีทุกcase ป้าย)มีการยกเลิก;;

ที่กล่าวว่าบางครั้งมันง่ายกว่าและ / หรือชัดเจนกว่าในการยุบทุกสิ่งลงในแบบไม่ซ้อนกันcase:

case "$1:$2:$3" in

OK:*)
    # Nothing needs done
    echo -n "OK:1"
    ;;

CRITICAL:SOFT:[12])
    soft_reset_pool.sh
    ;;

CRITICAL:HARD:[12])
    hard_reset_pool.sh
    ;;

CRITICAL:HARD:[34])
    hard_reset_service
    ;;

esac

1

หากคุณต้องจัดการกับสตริงรูปแบบหลายรายการ:

ลองนึกภาพ $ 3 เป็นสตริง

...
CRITICAL:HARD:@("A"|"B"|"C"))
...

ใน Bash คุณจะต้องเพิ่มสิ่งต่อไปนี้ในสคริปต์:

shopt -s extglob

ขอบคุณHauke ​​Lagingสำหรับคำแนะนำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.