Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Bash प्रोग्रामिंग

Bash स्क्रिप्ट्स में विकल्प पार्सिंग में मास्टरी: एक चरण-दर-चरण गाइड

टर्मिनल कमांड्स में आमतौर पर विकल्प या स्विच होते हैं, जिनका उपयोग आप कमांड के काम करने के तरीके को संशोधित करने के लिए कर सकते हैं। विकल्प कमांड-लाइन इंटरफेस के लिए 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 इसे आसान बनाता है।

  1. Bash-it: स्क्रिप्ट्स, एलियास और कस्टम फंक्शन्स प्रबंधित करने के लिए परम बैश फ्रेमवर्क Bash-it: स्क्रिप्ट्स, एलियास और कस्टम फंक्शन्स प्रबंधित करने के लिए परम बैश फ्रेमवर्क

    Bash-it Bash 3.2+ के लिए सामुदायिक बैश कमांड और स्क्रिप्ट्स का एक बंडल है, जो ऑटोकंप्लीशन, थीम्स, एलियास, कस्टम फंक्शन्स और बहुत कुछ के साथ आता है। यह आपके दैनिक कार्य के लिए शेल स्क्रिप्ट्स और कस्टम कमांड्स को विकसित करने, बनाए रखने और उपयोग करने के लिए एक उपयोगी फ्रेमवर्क प्रदान करता है। यदि आप दै

  1. WSL के साथ Windows 10 पर Bash इंस्टॉल और उपयोग करें - चरण-दर-चरण ट्यूटोरियल WSL के साथ Windows 10 पर Bash इंस्टॉल और उपयोग करें - चरण-दर-चरण ट्यूटोरियल

    यहां बताया गया है कि Windows पर Linux शेल को कैसे सेट अप और उपयोग करें – Windows Subsystem for Linux (WSL) का उपयोग करके। यह ट्यूटोरियल 2020 के बाद से Windows 10 के अप-टू-डेट संस्करणों के लिए अभिप्रेत है। मैं Windows 10 के पुराने संस्करणों या Windows 8/7/XP/3.1 के लिए अन्य विधियों पर WSL का उपयोग कै

  1. Windows 10 पर Linux Bash Shell इंस्टॉल करें: पूर्ण चरण-दर-चरण गाइड Windows 10 पर Linux Bash Shell इंस्टॉल करें: पूर्ण चरण-दर-चरण गाइड

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