जवाबों:
हाँ, वे (लगभग) पूरी तरह से बराबर हैं।
एक [ … ]
निर्माण के अंदर :
=
ऑपरेटर (या यहां तक कि गैर 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
लागू extglob
:
संस्करण 4 के बाद से मार
जब '==' और '! =' ऑपरेटरों का उपयोग किया जाता है, तो ऑपरेटर के दाईं ओर स्ट्रिंग को एक पैटर्न माना जाता है और पैटर्न मिलान में नीचे वर्णित नियमों के अनुसार मिलान किया जाता है, जैसे कि एक्सग्लोब शेल विकल्प को सक्षम किया गया था ।
इसका मतलब है कि उस विकल्प के साथ प्रयोग किया एक पैटर्न extglob
सेट नहीं एक मामले बयान में और एक के अंदर अलग तरह से काम करेगा [[
बैश संस्करण 4.3 के बाद निर्माण।
लागू |
:
मामले के लिए वाक्य रचना है:
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
shopt
में सेटिंग और मूल्यों$1
याpattern
, और न ही में$?
बाद में। एकमात्र अंतर यह है कि$1
उत्पादन में विस्तार नहीं किया जाता है जब नीचे चल रहा होxtrace
।