जब आप अपने कोड का कमांड लाइन पार्सिंग बिट लिखते हैं, तो आप निर्दिष्ट करते हैं कि कौन से विकल्प तर्क लेते हैं और कौन से नहीं। उदाहरण के लिए, एक शेल स्क्रिप्ट में एक -hविकल्प को स्वीकार करना (उदाहरण के लिए मदद) और एक -aविकल्प जो एक तर्क लेना चाहिए, आप करते हैं
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
a:hबिट कहते हैं, "मैं दो विकल्प पार्स करने के लिए उम्मीद कर रहा हूँ, -aऔर -h, और -aएक तर्क लेना चाहिए" (यह है :के बाद aकि पार्सर कि बताता है -aएक तर्क लेता है)।
इसलिए, कभी कोई अस्पष्टता नहीं होती है कि कोई विकल्प कहां समाप्त होता है, कहां उसका मूल्य शुरू होता है, और उसके बाद दूसरा कहां शुरू होता है।
इसे चलाना:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
यही कारण है कि आप ज्यादातर समय विकल्पों को पार्स करने के लिए अपनी खुद की कमांड लाइन पार्सर नहीं लिख सकते हैं।
इस उदाहरण में केवल एक ही मामला है जो मुश्किल है। पार्सिंग आमतौर पर पहले गैर-विकल्प पर रुकता है, इसलिए जब आपके पास कमांड लाइन पर सामान होता है जो विकल्पों की तरह दिखता है:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
निम्नलिखित हल है कि:
$ bash test.sh -a hello -- -world
h: 0
a: hello
--संकेत कमांड लाइन विकल्पों में से एक को समाप्त, और -worldबिट जो कुछ भी इसके साथ (यह स्थितीय चर में से एक में है) चाहता है ऐसा करने के लिए कार्यक्रम के लिए छोड़ दिया है।
यही है, वैसे, आप एक फ़ाइल को कैसे हटाते हैं जिसमें इसके फ़ाइल नाम की शुरुआत में एक डैश है rm।
संपादित करें :
उपयोगिताएँ C कॉल getopt()(घोषित unistd.h) में लिखी गई हैं जो उसी तरह से काम करती हैं। वास्तव में, हम सभी जानते हैं, bashफ़ंक्शन getoptsको सी लाइब्रेरी फ़ंक्शन के लिए कॉल का उपयोग करके लागू किया जा सकता है getopt()। पर्ल, पायथन और अन्य भाषाओं में समान कमांड लाइन पार्सिंग लाइब्रेरी हैं, और यह सबसे अधिक संभावना है कि वे इसी तरह से अपने पार्सिंग का प्रदर्शन करते हैं।
इनमें से कुछ getoptऔर समान getoptपुस्तकालय दिनचर्या "लंबे" विकल्प भी संभालती है। ये आमतौर पर डबल-डैश ( --) से पहले होते हैं , और लंबे विकल्प जो तर्क लेते हैं वे अक्सर एक समान संकेत के बाद ऐसा करते हैं, उदाहरण के --block-size=SIZEलिए duउपयोगिता [] के कुछ कार्यान्वयन (जो -B SIZEएक ही चीज़ को निर्दिष्ट करने की भी अनुमति देता है) का विकल्प।
कारण मैनुअल अक्सर छोटे विकल्पों के बीच एक स्थान दिखाने के लिए लिखे जाते हैं और उनके तर्क शायद पठनीयता के लिए होते हैं।
संपादित करें : वास्तव में पुराने उपकरण, जैसे ddऔर tarउपयोगिताओं, उनके सामने डैश के बिना विकल्प हैं। यह विशुद्ध रूप से ऐतिहासिक कारणों से और सॉफ्टवेयर के साथ संगतता बनाए रखने के लिए है जो उन पर निर्भर करता है कि वे ठीक उसी तरह से काम करें। tarउपयोगिता अधिक हाल के दिनों में डैश से विकल्प लेने की क्षमता हासिल की है। बीएसडी मैनुअल tar"बंडल किए गए झंडे" के लिए पुराने शैली के विकल्प कहता है।