शेल कमांड के बारे में बताएं: शिफ्ट $ (($ ऑप्टिंड - 1))


30

मैं एक लिनक्स आदमी नहीं हूं, लेकिन कुछ स्क्रिप्ट में अटका हुआ हूं जो मुझे अपने प्रोजेक्ट के लिए पढ़ना है। तो क्या कोई मेरी मदद कर सकता है कि यह कमांड क्या कर रहा है?

shift $(($optind - 1))

3
जैसा कि नीचे उल्लेख किया गया है, ऑप्टिन ऊपरी मामले में होना चाहिए और कोष्ठक के अंदर '$' वैकल्पिक है।
DarkHeart

जवाबों:


49

shift $((OPTIND-1))(नोट OPTINDऊपरी मामला है) आम तौर पर एक getopts whileलूप के तुरंत बाद पाया जाता है । $OPTINDइसके द्वारा मिलने वाले विकल्पों की संख्या है getopts

जैसा कि टिप्पणियों में pauljohn32 का उल्लेख है, सख्ती से बोलना, अगली कमांड लाइन तर्क OPTINDकी स्थिति देता है।

GNU बैश संदर्भ मैनुअल से :

ऑप्टॉप्रिंग नाम [args]

getoptsपोजिशन मापदंडों को पार्स करने के लिए शेल स्क्रिप्ट द्वारा उपयोग किया जाता है। optstringविकल्प वर्णों को मान्यता दी जानी चाहिए; यदि किसी वर्ण का बृहदान्त्र द्वारा अनुसरण किया जाता है, तो विकल्प में एक तर्क होने की उम्मीद की जाती है, जिसे व्हाट्सएप द्वारा इससे अलग किया जाना चाहिए। बृहदान्त्र (':') और प्रश्न चिह्न ('?') का उपयोग विकल्प वर्ण के रूप में नहीं किया जा सकता है। जब भी इसे लागू किया जाता है, getoptsअगले विकल्प को शेल वैरिएबल नाम में nameरखता है, अगर यह मौजूद नहीं है, तो इनिशियलाइज़ करना और अगले तर्क के इंडेक्स को वेरिएबल में प्रोसेस करना है OPTINDOPTINDप्रत्येक बार शेल या शेल स्क्रिप्ट को शुरू करने के लिए 1 को प्रारंभ किया जाता है। जब एक विकल्प को एक तर्क की आवश्यकता होती है, तो उस तर्क को चर में जगह देता है OPTARG। शेल रीसेट नहीं करता हैOPTIND खुद ब खुद; getoptsयदि पैरामीटर का एक नया सेट उपयोग किया जाना है, तो इसे एक ही शेल इनवोकेशन के भीतर कई कॉल के बीच मैन्युअल रूप से रीसेट करना होगा ।

जब विकल्पों का अंत सामने आता है, getoptsतो शून्य से अधिक रिटर्न वैल्यू के साथ बाहर निकलता है। OPTINDपहले गैर-विकल्प तर्क के सूचकांक पर सेट है, और नाम '?' पर सेट है।

getoptsआम तौर पर स्थितिगत मापदंडों को पार्स करता है, लेकिन यदि अधिक तर्क दिए जाते हैं args, तो getoptsइसके बजाय उन्हें पार्स करते हैं।

shift n
स्थैतिक मापदंडों की सूची से n तार निकालता है । इस प्रकार, shift $((OPTIND-1))उन सभी विकल्पों को हटा देता है getopts, जिन्हें पैरामीटर सूची से पार्स किया गया है , और इसलिए उस बिंदु के बाद, $1स्क्रिप्ट को दिए गए पहले गैर-विकल्प तर्क को संदर्भित करेगा।

अद्यतन करें

जैसा कि टिप्पणी में mikeserv का उल्लेख है, shift $((OPTIND-1))असुरक्षित हो सकता है। अनचाहे शब्द-विभाजन आदि को रोकने के लिए, सभी पैरामीटर विस्तार दोहरे-उद्धृत होने चाहिए। तो कमांड के लिए सुरक्षित फॉर्म है

shift "$((OPTIND-1))"


ऐसा लगता है कि यह केवल सही काम करेगा यदि विकल्प सभी शेष स्थिति संबंधी तर्कों से पहले होते हैं। सही बात?
स्टीव जोर्गेनसन

@SteveJorgensen: हाँ, यह सही है। OTOH, गैर-विकल्प तर्कों के बाद विकल्प रखना sh / bash सम्मेलन के खिलाफ जाता है। आम तौर पर, डैश के साथ शुरू नहीं होने वाले पहले तर्क विकल्पों के अंत का संकेत देते हैं, और डैश के साथ शुरू होने वाले किसी भी बाद के विकल्प को विकल्प नहीं माना जाता है। सभी कार्यक्रम इस सम्मेलन का पालन नहीं करते हैं, लेकिन यदि आप ऐसा करते हैं तो यह जीवन को बहुत सरल बना देता है। :)
PM 2Ring

@SteveJorgensen: (cont) इस विषय पर संक्षेप में चर्चा की गई है कि कुछ उपयोगिताएँ विकल्पों से पहले परिचालनों को पार्स क्यों करती हैं? । जैसा कि गाइल्स की टिप्पणी में सेलाडा के जवाब में उल्लेख किया गया है, कुछ कार्यक्रम (जैसे find) गैर-विकल्पों के बाद विकल्प की अनुमति देते हुए दिख सकते हैं, लेकिन वे ऐसा नहीं करते: उनके पास ऐसे ऑपरेशंस हैं जो एक डैश के साथ शुरू होते हैं।
बजे PM 2Ring

उस जानकारी के लिए धन्यवाद (और संपादित करें) @mosvy यह एक बहुत ही असामान्य बात है IFS, लेकिन खेद से सुरक्षित होना बेहतर है। ;)
दोपहर

@roaima अगर IFS=0123456789, shift $((OPTIND-1))(उद्धरण के बिना) चालू हो shift ""जाएगा जिसमें चुपचाप अनदेखा किया जाएगा (इन ksh) या एक त्रुटि उत्पन्न ( bashऔर dash)।
मच्छी जूल

8

$((...))बस सामान की गणना करता है। आपके मामले में यह $optint1 का मूल्य लेता है और प्रतिस्थापित करता है।

shiftस्थितिगत मापदंडों को हटाता है। आपके मामले में यह optint-1मापदंडों को हटा देता है।

अधिक जानकारी के लिए पर एक नजर है help getopts, help shift, पर नज़र man bash"अंकगणित विस्तार" के लिए, और विशेष रूप से के लिए गूगल getopts

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