Bash trường hợp báo cáo thác tầng?


29

Tôi đang cố gắng làm một cái gì đó như thế này:

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac

trong đó nếu $ level = 3, nó sẽ xuất ra

Level Three
Level Two
Level One

trong khi nếu $ level = 1, nó sẽ chỉ xuất ra

Level One

Nhưng khi tôi thử nó, tôi gặp lỗi syntax error near unexpected token ')'vì tôi không bao gồm ;;.

Mọi ngôn ngữ khác mà tôi biết đều cho phép điều này, có cách nào để thực hiện nó trong bash không? Một số loại từ khóa có nghĩa là "bây giờ tiếp tục và làm trường hợp tiếp theo như thể nó phù hợp"?


2
Nếu mọi ngôn ngữ bạn biết đều cho phép điều này, bạn cần học các ngôn ngữ khác ngoài C và những kẻ bắt chước. Sự sụp đổ trong các tuyên bố trường hợp là một tai nạn thiết kế lịch sử ở C mà bằng cách nào đó đã sống sót trong các ngôn ngữ nguyên tắc hơn.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


42

Bạn cần sử dụng ;&thay vì ;;để có hành vi thông qua:

#! /bin/bash
foo() {
    case "$1" in
        3)
            echo "Level Three"
            ;&
        2)
            echo "Level Two"
            ;&
        1)
            echo "Level One"
            ;;
        a)
            echo "Level a"
            ;&
        b)
            echo "Level b"
            ;&
        c)
            echo "Level c"
            ;;
    esac
}
echo 3:
foo 3
echo 2:
foo 2
echo a:
foo a
3:
Level Three
Level Two
Level one
2:
Level Two
Level one
a:
Level a
Level b
Level c

Xem phần Cấu trúc có điều kiện của tài liệu bash.

Điểm đánh dấu đặc biệt khác là ;;&, trong đó:

làm cho shell kiểm tra các mẫu trong mệnh đề tiếp theo, nếu có và thực hiện bất kỳ danh sách lệnh liên quan nào trên một kết quả khớp thành công.

;; luôn luôn là cuối cùng, không có mẫu nào được thử nghiệm.

#! /bin/bash

foo() {
    case "$1" in
        *3*)
            echo "Level Three"
            ;;&
        *2*)
            echo "Level Two"
            ;;&
        *1*)
            echo "Level One"
            ;;&
    esac
}

echo 12:
foo 12
echo 13:
foo 13
echo 23:
foo 23
12:
Level Two
Level One
13:
Level Three
Level One
23:
Level Three
Level Two

18
Lưu ý về tính di động: cú pháp đó không phải là POSIX. Nó đến từ kshvà có sẵn trong ksh, bash(kể từ 4.0, 2009) và zsh(kể từ 3.1.2, 1997). ;;&là đặc trưng của bash.
Stéphane Chazelas

4
Cũng lưu ý rằng zshtương đương với bash's ;;&được ;|(thêm vào trong 4.3.3, 2007).
Stéphane Chazelas
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.