cú pháp bash lồng nhau và ;; thiết bị đầu cuối


14

Tôi đã có đủ (hoặc có thể là quá nhiều) dấu ;;chấm hết trong tập lệnh bash này có chứa các lồng nhau casechưa?

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

Đã được một vài năm kể từ khi tôi tức giận.

Câu trả lời:


36

Sẽ dễ dàng hơn để theo dõi nếu bạn sử dụng thụt đầu dòng hợp lý trên ;;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

Họ phù hợp tốt, mỗi case nhãn) có một chấm dứt;;

Điều đó nói rằng, đôi khi dễ dàng hơn và / hoặc rõ ràng hơn để thu gọn mọi thứ thành không lồng nhau 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

Nếu bạn phải xử lý nhiều chuỗi mẫu:

Hãy tưởng tượng $ 3 là một chuỗi.

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

Trong Bash, bạn cần thêm phần sau vào tập lệnh:

shopt -s extglob

Cảm ơn Hauke ​​Laging cho tiền boa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.