टर्मिनल कमांड में आमतौर पर विकल्प या स्विच होते हैं, जिनका उपयोग आप संशोधित करने के लिए कर सकते हैं कि कमांड कैसे करता है। कमांड लाइन इंटरफेस के लिए पॉज़िक्स विनिर्देश में विकल्प शामिल हैं। यह सबसे पुराने यूनिक्स अनुप्रयोगों के साथ स्थापित एक समय-सम्मानित सम्मेलन भी है, इसलिए यह जानना अच्छा है कि जब आप अपनी खुद की कमांड बना रहे हों तो उन्हें अपनी बैश स्क्रिप्ट में कैसे शामिल करें।
अधिकांश भाषाओं की तरह, बैश में विकल्पों को पार्स करने की समस्या को हल करने के कई तरीके हैं। आज तक, मेरी पसंदीदा विधि वही है जो मैंने पैट्रिक वोल्करडिंग की स्लैकवेयर बिल्ड स्क्रिप्ट से सीखी थी, जो शेल स्क्रिप्टिंग के लिए मेरे परिचय के रूप में काम करती थी जब मैंने पहली बार लिनक्स की खोज की थी और ओएस के साथ शिप की गई प्लेन टेक्स्ट फ़ाइलों में उद्यम करने का साहस किया था।पी>
बैश में विकल्प पार्सिंग
बैश में विकल्पों को पार्स करने की रणनीति आपकी शेल स्क्रिप्ट को दिए गए सभी तर्कों के माध्यम से चक्र करना है, यह निर्धारित करना है कि वे एक विकल्प हैं या नहीं, और फिर अगले तर्क पर स्थानांतरित करें। इस प्रक्रिया को तब तक दोहराएं जब तक कोई विकल्प न रह जाए।
एक साधारण बूलियन विकल्प से शुरू करें (जिसे कभी-कभी स्विच . कहा जाता है) या एक ध्वज ):
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
इस कोड में, मैं एक while
create बनाता हूं लूप जो एक अनंत लूप के रूप में कार्य करता है जब तक कि प्रक्रिया के लिए कोई और तर्क न हो। एक if
कथन पहली स्थिति में जो भी तर्क मिलता है, उससे मिलान करने का प्रयास करता है ($1
) या तो --alpha
या -a
. (ये मनमाने विकल्प नाम हैं जिनका कोई विशेष महत्व नहीं है। एक वास्तविक स्क्रिप्ट में, आप --verbose
का उपयोग कर सकते हैं। और -v
वर्बोज़ आउटपुट को ट्रिगर करने के लिए)।
shift
कीवर्ड सभी तर्कों को 1 से स्थानांतरित करने का कारण बनता है, जैसे कि स्थिति 2 में एक तर्क ($2
) को स्थिति 1 में ले जाया जाता है ($1
) else
कथन तब ट्रिगर होता है जब प्रक्रिया के लिए कोई और तर्क नहीं होता है, जो while
. को तोड़ता है लूप।
स्क्रिप्ट के अंत में, $ALPHA
. का मान टर्मिनल पर प्रिंट किया जाता है।
स्क्रिप्ट का परीक्षण करें:
$ bash ./test.sh --alpha
1
$ bash ./test.sh
$ bash ./test.sh -a
1
विकल्प का सही ढंग से पता लगाया गया है।
बैश में तर्कों का पता लगाना
हालांकि, एक समस्या है:अतिरिक्त तर्कों को नज़रअंदाज़ कर दिया जाता है।
$ bash ./test.sh --alpha foo
1
$
उन तर्कों को पकड़ने के लिए जो विकल्प के रूप में अभिप्रेत नहीं हैं, आप शेष तर्कों को बैश सरणी में डंप कर सकते हैं।
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
स्क्रिप्ट के नए संस्करण का परीक्षण करें:
$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo
foo
$ bash ./test.sh --alpha foo bar
1
foo
bar
तर्कों वाले विकल्प
कुछ विकल्पों के लिए एक तर्क की आवश्यकता होती है। उदाहरण के लिए, हो सकता है कि आप उपयोगकर्ता को रंग या ग्राफ़िक के रिज़ॉल्यूशन जैसी विशेषता सेट करने की अनुमति देना चाहें या अपने एप्लिकेशन को कस्टम कॉन्फ़िगरेशन फ़ाइल पर इंगित करना चाहें।
इसे बैश में लागू करने के लिए, आप shift
. का उपयोग कर सकते हैं कीवर्ड जैसा कि आप बूलियन स्विच के साथ करते हैं लेकिन तर्कों को 1 के बजाय 2 से बदल दें।
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
CONFIG=$2
shift 2
else
break
fi
done
echo $ALPHA
echo $CONFIG
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
इस कोड में, मैं एक elif
जोड़ता हूं प्रत्येक तर्क की तुलना करने के लिए खंड --config
और -c
. मैच की स्थिति में, CONFIG
. नामक एक वैरिएबल का मान जो भी दूसरा तर्क है उसके मान पर सेट है (इसका अर्थ है कि --config
विकल्प के लिए तर्क की आवश्यकता होती है)। --config
. को शिफ्ट करने के लिए सभी तर्क 2:1 से शिफ्ट हो जाते हैं या -c
, और 1 अपने तर्क को आगे बढ़ाने के लिए। हमेशा की तरह, लूप तब तक दोहराता है जब तक कि कोई मिलान तर्क न रह जाए।
यहाँ स्क्रिप्ट के नए संस्करण का परीक्षण है:
$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz
विकल्प पार्स करना आसान बना दिया
बैश में विकल्पों को पार्स करने के अन्य तरीके हैं। आप वैकल्पिक रूप से case
. का उपयोग कर सकते हैं स्टेटमेंट या getopt
आज्ञा। आप जो भी उपयोग करना चुनते हैं, आपके उपयोगकर्ताओं के लिए विकल्प किसी भी एप्लिकेशन के लिए महत्वपूर्ण विशेषताएं हैं, और बैश इसे आसान बनाता है।