टर्मिनल कमांड्स में आमतौर पर विकल्प या स्विच होते हैं, जिनका उपयोग आप कमांड के काम करने के तरीके को संशोधित करने के लिए कर सकते हैं। विकल्प कमांड-लाइन इंटरफेस के लिए POSIX विनिर्देश में शामिल हैं। यह सबसे प्रारंभिक UNIX एप्लिकेशन्स के साथ स्थापित एक समय-सम्मानित कन्वेंशन भी है, इसलिए यह जानना अच्छा है कि जब आप अपने स्वयं के कमांड्स बना रहे हों तो उन्हें अपने Bash स्क्रिप्ट्स में कैसे शामिल किया जाए।
अधिकांश भाषाओं की तरह, Bash में विकल्पों को पार्स करने की समस्या को हल करने के कई तरीके हैं। आज तक, मेरी पसंदीदा विधि वही बनी हुई है जो मैंने Patrick Volkerding के Slackware बिल्ड स्क्रिप्ट्स से सीखी थी, जो मेरे लिए शेल स्क्रिप्टिंग का परिचय थीं जब मैंने पहली बार Linux की खोज की और OS के साथ शिप होने वाली प्लेन टेक्स्ट फ़ाइलों में उद्यम करने का साहस किया।
Bash में विकल्प पार्सिंग
Bash में विकल्पों को पार्स करने की रणनीति आपके शेल स्क्रिप्ट को पास किए गए सभी आर्गुमेंट्स के माध्यम से साइकिल चलाना है, यह निर्धारित करना कि वे विकल्प हैं या नहीं, और फिर अगले आर्गुमेंट पर शिफ्ट करना। इस प्रक्रिया को तब तक दोहराएं जब तक कोई विकल्प न रह जाए।
एक सरल बूलियन विकल्प (कभी-कभी स्विच या फ्लैग कहा जाता है) से शुरू करें:
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
इस कोड में, मैं एक while लूप बनाता हूं जो एक अनंत लूप के रूप में कार्य करता है जब तक कोई और आर्गुमेंट्स प्रोसेस करने के लिए नहीं रहते। एक 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 में आर्गुमेंट्स डिटेक्ट करना
हालांकि, एक समस्या है: अतिरिक्त आर्गुमेंट्स नजरअंदाज हो जाते हैं।
$ bash ./test.sh --alpha foo
1
$
विकल्पों के रूप में अभिप्रेत नहीं आर्गुमेंट्स को पकड़ने के लिए, आप शेष आर्गुमेंट्स को एक Bash array में डंप कर सकते हैं।
#!/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
आर्गुमेंट्स वाले विकल्प
कुछ विकल्पों को अपने स्वयं के आर्गुमेंट की आवश्यकता होती है। उदाहरण के लिए, आप उपयोगकर्ता को एक एट्रिब्यूट सेट करने की अनुमति देना चाह सकते हैं जैसे रंग या ग्राफिक का रिज़ॉल्यूशन या अपने एप्लिकेशन को एक कस्टम कॉन्फिगरेशन फ़ाइल पर इंगित करना।
इसे Bash में लागू करने के लिए, आप 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
इस कोड में, मैं प्रत्येक आर्गुमेंट की तुलना --config और -c दोनों से करने के लिए एक elif क्लॉज जोड़ता हूं। मैच की स्थिति में, CONFIG नामक वेरिएबल का मान दूसरे आर्गुमेंट के मान पर सेट किया जाता है (इसका मतलब है कि --config विकल्प को एक आर्गुमेंट की आवश्यकता होती है)। सभी आर्गुमेंट्स 2 से स्थान बदलते हैं: 1 --config या -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
विकल्प पार्सिंग आसान बनाया गया
Bash में विकल्पों को पार्स करने के अन्य तरीके हैं। आप वैकल्पिक रूप से एक case स्टेटमेंट या getopt कमांड का उपयोग कर सकते हैं। आप जो भी चुनते हैं, आपके उपयोगकर्ताओं के लिए विकल्प किसी भी एप्लिकेशन के लिए महत्वपूर्ण विशेषताएं हैं, और Bash इसे आसान बनाता है।