शेल स्क्रिप्ट में $ {0% / *} क्या करता है?


17

क्षमा करें यदि यह एक बेवकूफ सवाल है, लेकिन मैंने इसके बारे में सफलता के बिना खोज की।

वास्तव में दूसरी पंक्ति क्या करती है?:

#!/bin/sh
cd ${0%/*} || exit 1

मुझे पता है कि पहला शेबंग है, दूसरा निर्देशिका को बदलने की कोशिश करता है लेकिन भ्रामक हिस्सा है ${0%/*}

क्या आप मुझे दूसरी पंक्ति समझा सकते हैं?


2
जैसा कि एंड्रिया द्वारा एक उत्तर में समझाया गया है, $ {0% / *} इसे आमंत्रित करते हुए स्क्रिप्ट नाम के लिए उपसर्ग निर्देशिका पथ में अनुवाद करता है। एक वैकल्पिक बिल्ट-इन dirnameकमांड का उपयोग करना है, जैसे$(dirname $0)
हमेशा

@alwayslearning: जो शेल और शेल संस्करण आप उपयोग कर रहे हैं, वह किसमें dirnameबनाया गया है? यह निश्चित रूप से बाश v4.3.11 में नहीं है जो उबंटू ट्रस्टी में डिफ़ॉल्ट शेल है।
डेविड फ़ॉस्टर

भ्रम के लिए मेरी माफी, बस जाँच की है कि dirnameएक खोल में निर्मित नहीं है।
alwayslearning

जवाबों:


27

${0}स्क्रिप्ट का पहला तर्क है, यानी स्क्रिप्ट का नाम या रास्ता। यदि आप अपनी स्क्रिप्ट लॉन्च करते हैं path/to/script.sh, तो ${0}वास्तव में यह स्ट्रिंग होगी path/to/script.sh:।

%/*भाग के मूल्य को संशोधित करता है ${0}। इसका अर्थ है: /फ़ाइल नाम के बाद तक सभी वर्ण लें । ऊपर के उदाहरण में, ${0%/*}होगा path/to

आप इसे अपने शेल पर कार्रवाई में देख सकते हैं:

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to

Sh "पैरामीटर प्रतिस्थापन" के कई अन्य प्रकारों का समर्थन करता है। उदाहरण के लिए, पथ के बजाय फ़ाइल का नाम कैसे लिया जाए:

$ echo "${x##*/}"
script.sh

सामान्य में, %और %%पट्टी प्रत्यय, जबकि #और ##उपसर्ग पट्टी। आप पैरामीटर प्रतिस्थापन के बारे में अधिक पढ़ सकते हैं ।


2
यह "|| निकास 1" अनावश्यक प्रतीत होता है: यदि यह dir $ बदलने के लिए noway होगा? बराबर 1.
जोसेफ क्लिमुक

2
यह उल्लेख करना अच्छा होगा कि निर्माण को मैनुअल में "मिलान उपसर्ग / प्रत्यय पैटर्न निकालें" के रूप में प्रलेखित किया गया है। यह भी याद रखने का एक अच्छा तरीका है कि जो कि # 3 शिफ्ट है ( $ के बाएं ),% है शिफ्ट 5 ( $ का दाएं ), कम से कम यूएस कीबोर्ड पर।
chexum

1
@JosefKlimuk: || exit 1 हो सकता है क्योंकि जरूरत हो cdस्थिति 2, नहीं 1 के साथ हो सकता है बाहर निकलें, त्रुटि पर। हालांकि मैं मानता हूं कि यह बहुत उपयोगी नहीं है (आमतौर पर प्रोग्राम विशिष्ट निकास स्थितियों के बारे में परवाह नहीं करते हैं)। संभवतः यह एक बड़ी स्क्रिप्ट का हिस्सा है?
एंड्रिया कोरबेलिनी

1
@AndreaCorbellini निश्चित रूप से सही है। बहुत ज्यादा एकमात्र तरीका यह उपयोगी है जो एक बड़ी स्क्रिप्ट के हिस्से के रूप में उपयोगी हो सकता है। एक स्क्रिप्ट जो सिर्फ वर्तमान निर्देशिका को बदलती है, कोई प्रभाव नहीं पड़ता है, क्योंकि यह केवल उस स्क्रिप्ट को चलाने वाले शेल को प्रभावित करता है। मूल प्रक्रिया इसे कभी नहीं देखती है।
hvd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.