मैं एक लिनक्स आदमी नहीं हूं, लेकिन कुछ स्क्रिप्ट में अटका हुआ हूं जो मुझे अपने प्रोजेक्ट के लिए पढ़ना है। तो क्या कोई मेरी मदद कर सकता है कि यह कमांड क्या कर रहा है?
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
)।
$((...))
बस सामान की गणना करता है। आपके मामले में यह $optint
1 का मूल्य लेता है और प्रतिस्थापित करता है।
shift
स्थितिगत मापदंडों को हटाता है। आपके मामले में यह optint-1
मापदंडों को हटा देता है।
अधिक जानकारी के लिए पर एक नजर है help getopts
, help shift
, पर नज़र man bash
"अंकगणित विस्तार" के लिए, और विशेष रूप से के लिए गूगल getopts
।