$ {0 ## * /} और $ {0% / *} कैसे काम करते हैं?


33

मुझे शेल स्क्रिप्ट में निम्नलिखित नियमित अभिव्यक्तियों के बारे में काफी उलझन है:

${0##*/}
${0%/*}

वो कैसे काम करते है?

जवाबों:


38

वे नियमित अभिव्यक्ति नहीं हैं, वे बैश के पैरामीटर विस्तार के उदाहरण हैं: एक चर का प्रतिस्थापन या इसके मान से एक विशेष पैरामीटर। द वुलज विकी की अच्छी व्याख्या है

मूल रूप से, आपके पास उदाहरण में, इस प्रकार है ${0##*/}:

चर $ 0, और पैटर्न '/' के लिए, पैरामीटर की शुरुआत से दो हैश मतलब है , और पैटर्न सहित सबसे लंबे (या लालची) मैच को हटा दें।

तो, $0फ़ाइल का नाम कहां है, उदाहरण के लिए $HOME/documents/doc.txt, फिर पैरामीटर को इस प्रकार विस्तारित किया जाएगा:doc.txt

इसी तरह, ${0%/*}पैटर्न /को पैरामीटर के अंत ( %) के खिलाफ मिलान किया जाता है , सबसे छोटा या गैर-लालची मिलान हटा दिया जाता है - जो ऊपर दिए गए उदाहरण में आपको देगा $HOME/documents

बैश हैकर के विकी पर लेख भी देखें ।


2
इसलिए ... वे उपयोग नहीं करना चाहते थे basenameऔर dirname? : डी
आरोन डी। मरास्को ११'११

8
एक फायदा यह है कि पैरामीटर susbsteration एक सबप्रोसेस को स्पॉन नहीं करता है ...
jasonwryan

@ jasonwryan, क्या आप उपरोक्त दो उदाहरणों में * की कार्यक्षमता को विस्तृत कर सकते हैं? या हमें * वहां * क्यों लगाना पड़े। विशिष्ट रूप में, पहले उदाहरण में, * को // से पहले रखा गया है; जबकि दूसरे उदाहरण में, * के बाद रखा गया है। अंतर्निहित अंतर क्या है? धन्यवाद।
378 पर user785099

3
ग्लोब ( *) इंगित करता है कि पैटर्न तक और सहित सब कुछ हटा दिया जाएगा। इसलिए, पैरामीटर की शुरुआत के लिए #, यह बाईं ओर और अंत में है, %दाएं से दूसरे तरीके से काम कर रहा है।
jasonwryan

5
यह बैश-विशिष्ट नहीं है, यह POSIX द्वारा निर्दिष्ट है sh
nyuszika7h
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.