Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

अपने बैश शेल स्क्रिप्ट में विकल्प कैसे शामिल करें

टर्मिनल कमांड में आमतौर पर विकल्प या स्विच होते हैं, जिनका उपयोग आप संशोधित करने के लिए कर सकते हैं कि कमांड कैसे करता है। कमांड लाइन इंटरफेस के लिए पॉज़िक्स विनिर्देश में विकल्प शामिल हैं। यह सबसे पुराने यूनिक्स अनुप्रयोगों के साथ स्थापित एक समय-सम्मानित सम्मेलन भी है, इसलिए यह जानना अच्छा है कि जब आप अपनी खुद की कमांड बना रहे हों तो उन्हें अपनी बैश स्क्रिप्ट में कैसे शामिल करें।

अधिकांश भाषाओं की तरह, बैश में विकल्पों को पार्स करने की समस्या को हल करने के कई तरीके हैं। आज तक, मेरी पसंदीदा विधि वही है जो मैंने पैट्रिक वोल्करडिंग की स्लैकवेयर बिल्ड स्क्रिप्ट से सीखी थी, जो शेल स्क्रिप्टिंग के लिए मेरे परिचय के रूप में काम करती थी जब मैंने पहली बार लिनक्स की खोज की थी और ओएस के साथ शिप की गई प्लेन टेक्स्ट फ़ाइलों में उद्यम करने का साहस किया था।

बैश में विकल्प पार्सिंग

बैश में विकल्पों को पार्स करने की रणनीति आपकी शेल स्क्रिप्ट को दिए गए सभी तर्कों के माध्यम से चक्र करना है, यह निर्धारित करना है कि वे एक विकल्प हैं या नहीं, और फिर अगले तर्क पर स्थानांतरित करें। इस प्रक्रिया को तब तक दोहराएं जब तक कोई विकल्प न रह जाए।

एक साधारण बूलियन विकल्प से शुरू करें (जिसे कभी-कभी स्विच . कहा जाता है) या एक ध्वज ):

#!/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 आज्ञा। आप जो भी उपयोग करना चुनते हैं, आपके उपयोगकर्ताओं के लिए विकल्प किसी भी एप्लिकेशन के लिए महत्वपूर्ण विशेषताएं हैं, और बैश इसे आसान बनाता है।


  1. बैश-इट - बैश फ्रेमवर्क आपकी लिपियों और उपनामों को नियंत्रित करने के लिए

    बैश-इट बैश 3.2+ . के लिए समुदाय बैश कमांड और स्क्रिप्ट का एक बंडल है , जो स्वतः पूर्णता, थीम, उपनाम, कस्टम फ़ंक्शन, और बहुत कुछ के साथ आता है। यह आपके दैनिक कार्य के लिए शेल स्क्रिप्ट और कस्टम कमांड के विकास, रखरखाव और उपयोग के लिए एक उपयोगी ढांचा प्रदान करता है। यदि आप दैनिक आधार पर बैश शेल का उपय

  1. विंडोज 10 [ट्यूटोरियल] पर बैश (लिनक्स शेल) को कैसे स्थापित और उपयोग करें

    यहां बताया गया है कि विंडोज़ पर लिनक्स शेल को कैसे सेट अप करें और उसका उपयोग कैसे करें - लिनक्स के लिए विंडोज सबसिस्टम का उपयोग करके (WSL )। यह ट्यूटोरियल 2020 से विंडोज 10 के अप-टू-डेट वर्जन के लिए है। मैं विंडोज 10 के पुराने संस्करणों या विंडोज 8/7/XP/3.1 के अन्य तरीकों पर WSL का उपयोग करने के त

  1. विंडोज 10 पर लिनक्स बैश शेल कैसे स्थापित करें

    बैश शेल केवल एक कमांड-लाइन उपयोगिता है जो बहुत लंबे समय से लिनक्स का हिस्सा रही है और अब, माइक्रोसॉफ्ट ने इसे सीधे विंडोज 10 में जोड़ा है। यह न तो वर्चुअल मशीन है और न ही कोई कंटेनर या विंडोज के लिए संकलित कोई सॉफ्टवेयर। इसके बजाय, यह विंडोज़ पर एंड्रॉइड ऐप चलाने के लिए माइक्रोसॉफ्ट के बंद प्रोजेक्ट