क्या केस के बयान पर रोक लगाई जा सकती है?


29

मैं ऐसा कुछ करने की कोशिश कर रहा हूँ:

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac

जहां अगर $ स्तर = 3, यह उत्पादन होगा

Level Three
Level Two
Level One

जबकि अगर $ स्तर = 1, यह केवल उत्पादन होगा

Level One

लेकिन जब मैं इसे आज़माता हूं, मुझे त्रुटि मिलती है syntax error near unexpected token ')'क्योंकि मैंने इसमें शामिल नहीं किया था ;;

हर दूसरी भाषा जो मुझे पता है कि यह अनुमति देता है, क्या इसे बैश में करने का कोई तरीका है? किसी प्रकार का कीवर्ड जिसका अर्थ है "अब चलते हैं और अगला केस ऐसा करते हैं जैसे कि यह मेल खाता है"?


2
यदि आपको पता है कि हर भाषा इसकी अनुमति देती है, तो आपको C और इसके अनुलिपित्र के अलावा अन्य भाषाओं को सीखने की आवश्यकता है। मामले के बयानों में गिरावट सी में एक ऐतिहासिक डिजाइन दुर्घटना है जो किसी भी तरह अधिक राजसी भाषाओं में बची है।
गिल्स एसओ- बुराई को रोकें '10

जवाबों:


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 के बाद से)। ;;&बैश-विशिष्ट है।
स्टीफन चेज़लस

4
भी ध्यान रखें कि zshके बराबर bashकी ;;&है ;|(4.3.3, 2007 में जोड़े)।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.