मैं बताना चाहूंगा कि क्या एक स्ट्रिंग $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
।