बैश के [[ ]]
निर्माण के बारे में जानने के लिए कुछ महत्वपूर्ण चीजें हैं । सबसे पहला:
पद बंटवारे और पथ नाम विस्तार के बीच शब्दों पर प्रदर्शन नहीं कर रहे हैं [[
और ]]
; टिल्ड विस्तार, पैरामीटर और चर विस्तार, अंकगणितीय विस्तार, कमांड प्रतिस्थापन, प्रक्रिया प्रतिस्थापन, और उद्धरण हटाने का प्रदर्शन किया जाता है।
दूसरी बात:
एक अतिरिक्त बाइनरी ऑपरेटर, '= ~' उपलब्ध है, ... ऑपरेटर के दाईं ओर स्ट्रिंग को एक विस्तारित नियमित अभिव्यक्ति माना जाता है और तदनुसार मिलान किया जाता है ... पैटर्न के किसी भी हिस्से को मिलान करने के लिए बाध्य करने के लिए उद्धृत किया जा सकता है। एक स्ट्रिंग के रूप में ।
नतीजतन, इच्छा के $v
दोनों ओर =~
उस चर के मूल्य में विस्तार किया जाएगा, लेकिन परिणाम शब्द-विभाजन या pathname- विस्तारित नहीं होगा। दूसरे शब्दों में, बाएं हाथ की ओर से निकले हुए चर विस्तार को छोड़ना पूरी तरह से सुरक्षित है, लेकिन आपको यह जानना होगा कि चर विस्तार दाएं हाथ की तरफ होगा।
तो अगर आप लिखें: [[ $x =~ [$0-9a-zA-Z] ]]
, $0
सही पर regex अंदर से पहले regex व्याख्या की है विस्तार किया जाएगा, जो शायद संकलित करने के लिए (असफल करने के लिए regex का कारण होगा, जब तक के विस्तार $0
अंक या विराम चिह्न के साथ समाप्त होता है जिसका ascii मूल्य से कम है एक अंक)। यदि आप दाहिने-हाथ की तरफ को कोट करते हैं [[ $x =~ "[$0-9a-zA-Z]" ]]
, तो -तो , दाहिने हाथ की तरफ एक साधारण स्ट्रिंग के रूप में माना जाएगा, न कि एक रेगेक्स (और $0
अभी भी विस्तारित किया जाएगा)। इस मामले में आप वास्तव में क्या चाहते हैं[[ $x =~ [\$0-9a-zA-Z] ]]
इसी तरह, रेगेक्स की व्याख्या करने से पहले [[
और उसके बीच के ]]
शब्दों को शब्दों में विभाजित किया जाता है। तो रेगेक्स में रिक्त स्थान से बचने या उद्धृत करने की आवश्यकता है। आप अक्षर, अंक या रिक्त स्थान मिलान करना चाहते थे, तो आप इस्तेमाल कर सकते हैं: [[ $x =~ [0-9a-zA-Z\ ] ]]
। अन्य पात्रों को भी इसी तरह से भाग जाने की जरूरत है, जैसे #
, यदि उद्धृत नहीं किया गया तो एक टिप्पणी शुरू होगी। बेशक, आप पैटर्न को एक चर में डाल सकते हैं:
pat="[0-9a-zA-Z ]"
if [[ $x =~ $pat ]]; then ...
रेगेक्स के लिए, जिसमें बहुत सारे पात्र हैं, जिन्हें बश के लेक्सर के माध्यम से पारित होने से बचने या उद्धृत करने की आवश्यकता होती है, बहुत से लोग इस शैली को पसंद करते हैं। लेकिन सावधान रहें: इस मामले में, आप चर विस्तार को उद्धृत नहीं कर सकते :
if [[ $x =~ "$pat" ]]; then ...
अंत में, मुझे लगता है कि आप जो करने की कोशिश कर रहे हैं वह यह सत्यापित करने के लिए है कि चर में केवल मान्य वर्ण हैं। इस चेक को करने का सबसे आसान तरीका यह सुनिश्चित करना है कि इसमें एक अमान्य चरित्र नहीं है। दूसरे शब्दों में, इस तरह एक अभिव्यक्ति:
valid='0-9a-zA-Z $%&#'
if [[ ! $x =~ [^$valid] ]]; then ...
!
परीक्षण को नकारता है, इसे "मैच नहीं करता" ऑपरेटर में बदल देता है, और एक [^...]
रेगीक्स वर्ण वर्ग का अर्थ है "के अलावा कोई भी चरित्र ...
"।
पैरामीटर विस्तार और रेगेक्स ऑपरेटरों के संयोजन नियमित अभिव्यक्ति वाक्यविन्यास को "लगभग पठनीय" बना सकते हैं, लेकिन अभी भी कुछ गोच हैं। (हमेशा नहीं हैं?) एक वह है जिसे आप नहीं डाल ]
सकते हैं $valid
, भले ही $valid
उद्धृत किया गया हो, बहुत शुरुआत को छोड़कर। (यह एक पॉसिक्स रेगेक्स नियम है: यदि आप ]
एक चरित्र वर्ग में शामिल करना चाहते हैं , तो इसे शुरुआत में जाने की आवश्यकता है -
, शुरुआत या अंत में जा सकते हैं, इसलिए यदि आपको दोनों की आवश्यकता है ]
और -
, आपको इसके साथ शुरू करने ]
और समाप्त करने की आवश्यकता है -
,) regex के लिए अग्रणी "मुझे पता है कि मैं क्या कर रहा हूँ" इमोटिकॉन: [][-]
)