ทุบตีคำสั่งกรณีน้ำตกทั้งหมด?


29

ฉันพยายามทำสิ่งนี้:

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac

โดยที่ถ้าระดับ $ = 3 มันจะส่งออก

Level Three
Level Two
Level One

ในขณะที่ถ้า $ level = 1 มันจะออกเท่านั้น

Level One

แต่เมื่อผมลองแล้วฉันจะได้รับข้อผิดพลาดเพราะผมไม่ได้รวมsyntax error near unexpected token ')';;

ทุกภาษาที่ฉันรู้จักอนุญาตให้ทำสิ่งนี้มีวิธีที่จะทำได้ในการทุบตีหรือไม่? คำหลักบางประเภทที่หมายถึง "ตอนนี้ไปและทำกรณีถัดไปราวกับว่ามันตรงกับ"?


2
หากทุกภาษาที่คุณรู้จักอนุญาตให้ทำเช่นนี้คุณต้องเรียนรู้ภาษาอื่นที่ไม่ใช่ C และผู้ลอกเลียนแบบ ข้อผิดพลาดในกรณีที่งบเป็นอุบัติเหตุการออกแบบทางประวัติศาสตร์ใน C ที่รอดชีวิตอย่างใดในภาษาที่มีหลักการมากขึ้น
Gilles 'หยุดความชั่วร้าย' Gilles

คำตอบ:


42

คุณจำเป็นต้องใช้;&แทนที่จะ;;ได้รับพฤติกรรมตก:

#! /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

ดูส่วนโครงสร้างเงื่อนไขของเอกสารทุบตี

เครื่องหมายพิเศษอื่น ๆ คือ;;&:

ทำให้เชลล์ทดสอบรูปแบบในประโยคถัดไปถ้ามีและเรียกใช้งานรายการคำสั่งที่เกี่ยวข้องในการจับคู่ที่ประสบความสำเร็จ

;; ถือเป็นที่สิ้นสุดเสมอไม่มีการทดสอบรูปแบบเพิ่มเติม

#! /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
หมายเหตุการพกพา: ไวยากรณ์นั้นไม่ใช่ POSIX มันมาจากkshและอยู่ในที่มีอยู่ksh, bash(ตั้งแต่ 4.0, 2009) และzsh(ตั้งแต่ 3.1.2, 1997) ;;&เฉพาะทุบตี
Stéphane Chazelas

4
นอกจากนี้ยังทราบว่าzshเทียบเท่าbash's ;;&ถูก;|(เพิ่มเข้ามาใน 4.3.3, 2007)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.