[[और मामले में मामले की तुल्यता


13

कर देता है

if [[ "$1" = pattern ]]; then
    hook
fi

हमेशा वैसा ही व्यवहार करें

case "$1" in
    pattern) hook;;
esac

या कोई गोटे हैं?


1
मैं किसी भी मामलों में जहां वे अलग नहीं मिल रहा है, की परवाह किए बिना shoptमें सेटिंग और मूल्यों $1या pattern, और न ही में $?बाद में। एकमात्र अंतर यह है कि $1उत्पादन में विस्तार नहीं किया जाता है जब नीचे चल रहा हो xtrace
Kusalananda

जवाबों:


7

हाँ, वे (लगभग) पूरी तरह से बराबर हैं।


विस्तार

एक [ … ]निर्माण के अंदर :

=ऑपरेटर (या यहां तक कि गैर POSIX विकल्प ==) स्ट्रिंग मिलान, नहीं पैटर्न मिलान परीक्षण करती है।

एक [[ ]]निर्माण के अंदर (मैन बैश से):

जब == और! = ऑपरेटरों का उपयोग किया जाता है, तो ऑपरेटर के दाईं ओर स्ट्रिंग को एक पैटर्न माना जाता है और पैटर्न मिलान के तहत नीचे वर्णित नियमों के अनुसार मिलान किया जाता है । यदि शेल विकल्प nocasematch सक्षम है, तो मैच अक्षर वर्णों के मामले की परवाह किए बिना किया जाता है । वापसी मान 0 है यदि स्ट्रिंग मेल (==) या पैटर्न से मेल नहीं खाता है (=!) और 1 अन्यथा। पैटर्न के किसी भी हिस्से को स्ट्रिंग के रूप में मिलान करने के लिए मजबूर करने के लिए उद्धृत किया जा सकता है।

एक caseनिर्माण के अंदर (आदमी मार, संपादित और जोर मेरा) से:

मामले में शब्द [[(] पैटर्न [| पैटर्न] ...) सूची ;; ] ... esac
... कोशिश करता बदले में प्रत्येक पैटर्न के खिलाफ यह मैच के लिए, एक ही मिलान का उपयोग कर नियमों के लिए के रूप में पथ विस्तार (नीचे पथ विस्तार देखें)। ... जांच की गई प्रत्येक पैटर्न को टिल्ड विस्तार, पैरामीटर और चर विस्तार, अंकगणितीय प्रतिस्थापन, कमांड प्रतिस्थापन और प्रक्रिया प्रतिस्थापन का उपयोग करके विस्तारित किया गया है। यदि शेल विकल्प nocasematch सक्षम है, तो मैच अक्षर वर्णों के मामले की परवाह किए बिना किया जाता है ।

दोनों Pattern Matchingऔर Pathname Expansionबैश मैनुअल के अंदर एक ही मतलब करने के लिए उपयोग किया जाता है।

फर्क सिर्फ इतना है कि मैं मैनुअल में देख सकता हूं:

`[[ … ]]`                                   case
tilde  expansion                            tilde expansion
parameter and variable expansion            parameter and variable expansion
arithmetic expansion                        arithmetic substitution
command substitution                        command substitution
process substitution                        process substitution
quote removal

यह quote removalमामला निर्माण के लिए स्पष्ट रूप से सूचीबद्ध नहीं है।
जो इसे ( [[ … ]]) के लिए मेल खाने के लिए काम करता है :

पैटर्न के किसी भी हिस्से को स्ट्रिंग के रूप में मिलान करने के लिए मजबूर करने के लिए उद्धृत किया जा सकता है।

इस अंतिम बिंदु का परीक्षण करने के लिए इसका उपयोग करें (अब चर एक पैटर्न नहीं है):

case "$1" in
  "$pattern") echo case match
esac

लगभग क्यों?

  1. लागू extglob:

    संस्करण 4 के बाद से मार

    जब '==' और '! =' ऑपरेटरों का उपयोग किया जाता है, तो ऑपरेटर के दाईं ओर स्ट्रिंग को एक पैटर्न माना जाता है और पैटर्न मिलान में नीचे वर्णित नियमों के अनुसार मिलान किया जाता है, जैसे कि एक्सग्लोब शेल विकल्प को सक्षम किया गया था

    इसका मतलब है कि उस विकल्प के साथ प्रयोग किया एक पैटर्न extglob सेट नहीं एक मामले बयान में और एक के अंदर अलग तरह से काम करेगा [[बैश संस्करण 4.3 के बाद निर्माण।

  2. लागू |:

    मामले के लिए वाक्य रचना है:

    case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

    जिसका अर्थ है कि |(या) द्वारा अलग किए गए कई पैटर्न हो सकते हैं ।

    ऐशे ही:

    shopt -s extglob;      p1="+([0-9])";       p2="+([abcde])"
    
    case "$1" in
        $p1|$p2)    echo "or case match" ; ;;
    esac
    

    जो या तो केवल संख्याओं के एक स्ट्रिंग से मेल खाएगा या केवल अक्षरों में abcde, जैसे 1234या aabee, लेकिन नहीं 12aया नहीं b23

    [[यदि regex (var p3 को देखें) का उपयोग किया जाता है तो A समान रूप से काम करेगा :

    #!/bin/bash
    
    shopt -s extglob           ### Use extended globbing.
    shopt -s globasciiranges   ### The range [a-z] will expand to [abcdefghijklmnopqrstuvwxyz].
    
    pattern="+([0-9])"
    p1="+([0-9])"
    p2="+([a-z])"
    p3="^([0-9]+|[a-z]+)$"
    
    case "$1" in
        $pattern)   echo case1 match ; ;&
        $p1|$p2)    echo case2 match ; ;;
    esac
    
    [[ "$1" == $pattern ]] && echo if1 match
    [[ "$1" =~ $p3 ]] && echo if2 match
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.