मैं बताना चाहूंगा कि क्या एक स्ट्रिंग $stringएक ग्लोब पैटर्न द्वारा मिलान किया जाएगा $pattern। $stringकिसी मौजूदा फ़ाइल का नाम हो सकता है या नहीं। मैं यह कैसे कर सकता हूँ?
मेरे इनपुट स्ट्रिंग्स के लिए निम्न स्वरूपों को मानें:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
मैं एक पार्टी मुहावरा निर्धारित करता है कि अगर प्राप्त करना चाहते हैं $stringसे मिलान किया जाएगा $pattern1, $pattern2या किसी भी अन्य मनमाना ग्लोब पैटर्न। यहाँ मैंने अभी तक कोशिश की है:
[[ "$string" = $pattern ]]यह लगभग काम करता है, सिवाय इसके कि
$patternएक स्ट्रिंग पैटर्न के रूप में व्याख्या की जाती है और एक ग्लोब पैटर्न के रूप में नहीं।[ "$string" = $pattern ]इस दृष्टिकोण के साथ समस्या यह है कि
$patternविस्तार किया जाता है और फिर स्ट्रिंग तुलना$stringऔर विस्तार के बीच प्रदर्शन किया जाता है$pattern।[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]यह काम करता है, लेकिन केवल अगर
$stringकोई फ़ाइल मौजूद है जो मौजूद है।[[ $string =~ $pattern ]]यह काम नहीं करता है क्योंकि
=~ऑपरेटर$patternको एक विस्तारित नियमित अभिव्यक्ति के रूप में व्याख्या करने का कारण बनता है, न कि एक ग्लोब या वाइल्डकार्ड पैटर्न।
ls /foo/*
foo/{bar,baz}दौरान वास्तव में एक ब्रेस विस्तार (पैरामीटर विस्तार नहीं) foo/*है। $stringपैरामीटर विस्तार है। ये सभी अलग-अलग समय पर और विभिन्न तंत्रों द्वारा किए जाते हैं।
caseस्टेटमेंट बैश मैनुअल के अनुसार Pathname Expansion ("ग्लोबिंग") करता है।
{bar,baz}पैटर्न नहीं है। यह पैरामीटर विस्तार है। उस में सूक्ष्म लेकिन महत्वपूर्ण अंतर{bar,baz}कई तर्कों में बहुत जल्दी विस्तारित होता है,barऔरbaz।