जब आप अपने कोड का कमांड लाइन पार्सिंग बिट लिखते हैं, तो आप निर्दिष्ट करते हैं कि कौन से विकल्प तर्क लेते हैं और कौन से नहीं। उदाहरण के लिए, एक शेल स्क्रिप्ट में एक -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
"बंडल किए गए झंडे" के लिए पुराने शैली के विकल्प कहता है।