$ {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.