मैं एक लिनक्स आदमी नहीं हूं, लेकिन कुछ स्क्रिप्ट में अटका हुआ हूं जो मुझे अपने प्रोजेक्ट के लिए पढ़ना है। तो क्या कोई मेरी मदद कर सकता है कि यह कमांड क्या कर रहा है?
shift $(($optind - 1))
मैं एक लिनक्स आदमी नहीं हूं, लेकिन कुछ स्क्रिप्ट में अटका हुआ हूं जो मुझे अपने प्रोजेक्ट के लिए पढ़ना है। तो क्या कोई मेरी मदद कर सकता है कि यह कमांड क्या कर रहा है?
shift $(($optind - 1))
जवाबों:
shift $((OPTIND-1))(नोट OPTINDऊपरी मामला है) आम तौर पर एक getopts whileलूप के तुरंत बाद पाया जाता है । $OPTINDइसके द्वारा मिलने वाले विकल्पों की संख्या है getopts।
जैसा कि टिप्पणियों में pauljohn32 का उल्लेख है, सख्ती से बोलना, अगली कमांड लाइन तर्क OPTINDकी स्थिति देता है।
GNU बैश संदर्भ मैनुअल से :
ऑप्टॉप्रिंग नाम [args]
getoptsपोजिशन मापदंडों को पार्स करने के लिए शेल स्क्रिप्ट द्वारा उपयोग किया जाता है।optstringविकल्प वर्णों को मान्यता दी जानी चाहिए; यदि किसी वर्ण का बृहदान्त्र द्वारा अनुसरण किया जाता है, तो विकल्प में एक तर्क होने की उम्मीद की जाती है, जिसे व्हाट्सएप द्वारा इससे अलग किया जाना चाहिए। बृहदान्त्र (':') और प्रश्न चिह्न ('?') का उपयोग विकल्प वर्ण के रूप में नहीं किया जा सकता है। जब भी इसे लागू किया जाता है,getoptsअगले विकल्प को शेल वैरिएबल नाम मेंnameरखता है, अगर यह मौजूद नहीं है, तो इनिशियलाइज़ करना और अगले तर्क के इंडेक्स को वेरिएबल में प्रोसेस करना हैOPTIND।OPTINDप्रत्येक बार शेल या शेल स्क्रिप्ट को शुरू करने के लिए 1 को प्रारंभ किया जाता है। जब एक विकल्प को एक तर्क की आवश्यकता होती है, तो उस तर्क को चर में जगह देता हैOPTARG। शेल रीसेट नहीं करता हैOPTINDखुद ब खुद;getoptsयदि पैरामीटर का एक नया सेट उपयोग किया जाना है, तो इसे एक ही शेल इनवोकेशन के भीतर कई कॉल के बीच मैन्युअल रूप से रीसेट करना होगा ।जब विकल्पों का अंत सामने आता है,
getoptsतो शून्य से अधिक रिटर्न वैल्यू के साथ बाहर निकलता है।OPTINDपहले गैर-विकल्प तर्क के सूचकांक पर सेट है, और नाम '?' पर सेट है।
getoptsआम तौर पर स्थितिगत मापदंडों को पार्स करता है, लेकिन यदि अधिक तर्क दिए जाते हैंargs, तोgetoptsइसके बजाय उन्हें पार्स करते हैं।
shift n
स्थैतिक मापदंडों की सूची से n तार निकालता है । इस प्रकार, shift $((OPTIND-1))उन सभी विकल्पों को हटा देता है getopts, जिन्हें पैरामीटर सूची से पार्स किया गया है , और इसलिए उस बिंदु के बाद, $1स्क्रिप्ट को दिए गए पहले गैर-विकल्प तर्क को संदर्भित करेगा।
अद्यतन करें
जैसा कि टिप्पणी में mikeserv का उल्लेख है, shift $((OPTIND-1))असुरक्षित हो सकता है। अनचाहे शब्द-विभाजन आदि को रोकने के लिए, सभी पैरामीटर विस्तार दोहरे-उद्धृत होने चाहिए। तो कमांड के लिए सुरक्षित फॉर्म है
shift "$((OPTIND-1))"
find) गैर-विकल्पों के बाद विकल्प की अनुमति देते हुए दिख सकते हैं, लेकिन वे ऐसा नहीं करते: उनके पास ऐसे ऑपरेशंस हैं जो एक डैश के साथ शुरू होते हैं।
IFS, लेकिन खेद से सुरक्षित होना बेहतर है। ;)
IFS=0123456789, shift $((OPTIND-1))(उद्धरण के बिना) चालू हो shift ""जाएगा जिसमें चुपचाप अनदेखा किया जाएगा (इन ksh) या एक त्रुटि उत्पन्न ( bashऔर dash)।
$((...))बस सामान की गणना करता है। आपके मामले में यह $optint1 का मूल्य लेता है और प्रतिस्थापित करता है।
shiftस्थितिगत मापदंडों को हटाता है। आपके मामले में यह optint-1मापदंडों को हटा देता है।
अधिक जानकारी के लिए पर एक नजर है help getopts, help shift, पर नज़र man bash"अंकगणित विस्तार" के लिए, और विशेष रूप से के लिए गूगल getopts।