2011-04-06 15 views
98

मैं बैश (आदर्श केस-असंवेदनशील) में गिरावट के मामलों के साथ स्विच स्टेटमेंट के सही वाक्यविन्यास की तलाश में हूं। PHP में मुझे यह पसंद है कार्यक्रम होगा:गिरावट के साथ मामले स्विच करें?

switch($c) { 
    case 1: 
     do_this(); 
     break; 
    case 2: 
    case 3: 
     do_what_you_are_supposed_to_do(); 
     break; 
    default: 
     do_nothing(); 
} 

मैं बैश में एक ही हैं:

case "$C" in 
    "1") 
     do_this() 
     ;; 
    "2") 
    "3") 
     do_what_you_are_supposed_to_do() 
     ;; 
    *) 
     do_nothing(); 
     ;; 
esac 

यह किसी भी तरह काम नहीं करता है: समारोह do_what_you_are_supposed_to_do() सक्रिय किया जाना चाहिए $ सी 2 या 3।

+2

कोष्ठक के साथ कॉल कार्यों का प्रयोग न करें !!! चूंकि आप 'फ़ंक्शन fname {echo "fname के अंदर" का उपयोग करके बैश में फ़ंक्शन को परिभाषित कर सकते हैं; वापसी 0; } 'या 'fname() {echo" fname के अंदर "; वापसी 0; } 'फ़ंक्शन कॉल पर अभिभावकों को रखकर ऐसा लगता है कि यह एक फ़ंक्शन निश्चित है। कार्यों को किसी भी अन्य कमांड लाइन प्रोग्राम जैसे 'एमवी',' सीपी', 'rsync', 'ls',' cd', आदि जैसे कहा जाना चाहिए ... इस मामले में हम इस तरह fname कहते हैं:' fname $ ARGS' । –

+0

'do_nothing()' एक SKIP कथन होगा? ':' का प्रयोग करें। – sjas

उत्तर

176

"या" के लिए लंबवत बार (|) का उपयोग करें।

case "$C" in 
"1") 
    do_this() 
    ;; 
"2" | "3") 
    do_what_you_are_supposed_to_do() 
    ;; 
*) 
    do_nothing() 
    ;; 
esac 
+19

या इस साधारण मामले में एक वर्ण वर्ग '[23])' – SiegeX

22
  • बैश में फ़ंक्शन नाम के पीछे () का उपयोग जब तक आप उन्हें परिभाषित करने के लिए पसंद नहीं है। मामले में
  • उपयोग [23] मैच के लिए 2 या 3
  • स्थिर स्ट्रिंग मामलों ""

तो "" में संलग्न करने के बजाय '' से घिरा किया जाना चाहिए, दुभाषिया (बेकार) मूल्य में संभव चर का विस्तार करने की कोशिश करता है मिलान से पहले।

चरित्र वर्गों
case "$C" in 
'1') 
    do_this 
    ;; 
[23]) 
    do_what_you_are_supposed_to_do 
    ;; 
*) 
    do_nothing 
    ;; 
esac 

केस संवेदी मिलान के लिए, आप उपयोग कर सकते हैं (जैसे [23]):

case "$C" in 

# will match C='Abra' and C='abra' 
[Aa]'bra') 
    do_mysterious_things 
    ;; 

# will match all letter cases at any char like `abra`, `ABRA` or `AbRa` 
[Aa][Bb][Rr][Aa]) 
    do_wild_mysterious_things 
    ;; 

esac 

लेकिन abra कभी भी हिट नहीं किया, क्योंकि यह पहला मामला से मिलान किया जाएगा।

यदि आवश्यक हो, तो आप पहले मामलों में ;; को भी छोड़ सकते हैं ताकि निम्नलिखित मामलों में मैचों के लिए परीक्षण जारी रखा जा सके। (;;esac को छलांग)

+0

यदि मामला महत्वपूर्ण नहीं है तो आप सी को लोअरकेस 'केस" $ {सी,} "में परिवर्तित कर सकते हैं यदि – Sprinterfreak

+0

क्या होता है तो क्या होता है यदि आप इसे छोड़ देते हैं '' ;;? क्या आप गिरावट के लिए '; &' का उपयोग नहीं करना चाहते हैं? – HelloGoodbye

+0

मुझे सिंटैक्स त्रुटि मिलती है यदि मैं छोड़ देता हूं;; 'मुझे'; & 'का उपयोग करने की आवश्यकता है, यदि मैं परीक्षण जारी रखना चाहता हूं। – Jasen

45

हाल bash संस्करणों ;; की जगह में ;& का उपयोग करके गिरावट के माध्यम से अनुमति देते हैं: वे भी वहाँ ;;& का उपयोग करके मामले की जाँच करता शुरू करने की अनुमति देते हैं।

for n in 4 14 24 34 
do 
    echo -n "$n = " 
    case "$n" in 
    3?) 
    echo -n thirty- 
    ;;& #resume (to find ?4 later) 
    "24") 
    echo -n twenty- 
    ;& #fallthru 
    "4" | ?4) 
    echo -n four 
    ;;& # resume (to find teen where needed) 
    "14") 
    echo -n teen 
    esac 
    echo 
done 

नमूना उत्पादन

4 = four 
14 = fourteen 
24 = twenty-four 
34 = thirty-four 
8

इस प्रयास करें:

case $VAR in 
normal) 
    echo "This doesn't do fallthrough" 
    ;; 
special) 
    echo -n "This does " 
    ;& 
fallthrough) 
    echo "fall-through" 
    ;; 
esac 
+0

जो एक बहुत ही उपयोगी युक्ति है। कम से कम बैश 4.3.11 के लिए। मैंने किसी अन्य पर कोशिश करने के लिए परेशान नहीं किया है। – Daniel

+0

धन्यवाद धन्यवाद, धन्यवाद! –

+1

नोट: यह बैश 3.2 के लिए काम नहीं करता है, जो अभी भी मैकोज़ में डिफ़ॉल्ट बैश है। –

संबंधित मुद्दे