यह ट्यूटोरियल बताता है कि अपने bash स्क्रिप्ट को कमांड-लाइन आर्गुमेंट कैसे पास करें। आरंभ करने में आपकी सहायता के लिए कई उदाहरण शामिल हैं।
Bash/Shell स्क्रिप्ट आपके Linux वर्कफ़्लो को स्वचालित करने और आपके कार्यदिवस को गति देने का एक शानदार तरीका है ताकि आप जल्दी कार्यालय छोड़ सकें (या सर्वर रूम में 5 बजे तक छिपे रहें)।
स्क्रिप्ट को पुन: प्रयोज्य बनाना उन्हें अधिक उपयोगी बनाता है – आपको एक ऐसा स्क्रिप्ट लिखने की आवश्यकता नहीं है जो अलग-अलग सूचनाओं के सेट या अलग-अलग दिनों के लिए समान कार्य करता है – आप उसी स्क्रिप्ट का पुन: उपयोग कर सकते हैं और अलग-अलग पैरामीटर प्रदान कर सकते हैं – कमांड लाइन के माध्यम से स्क्रिप्ट को प्रदान किए गए निर्देश। इसे कभी-कभी कमांड लाइन आर्गुमेंट का उपयोग करना भी कहा जाता है।
उदाहरण के लिए, आपके पास एक स्क्रिप्ट हो सकती है जो कुछ टेक्स्ट को फ़ाइल में आउटपुट करती है। यदि आप फ़ाइल नाम बदलना चाहते हैं, तो आपको स्क्रिप्ट संपादित करनी होगी। यदि आप चाहते हैं कि स्क्रिप्ट कई फ़ाइलों में आउटपुट करे, तो आपको हाथ में स्क्रिप्ट की कई कॉपी की आवश्यकता हो सकती है। पैरामीटर का उपयोग करके, आपके पास एक सिंगल स्क्रिप्ट हो सकती है जो किसी भी संख्या में फ़ाइलों में आउटपुट कर सकती है, किसी भी नाम के साथ, कमांड लाइन से पैरामीटर के रूप में पास किए गए।
ये पैरामीटर – विकल्प और उनके मान – को आपकी स्क्रिप्ट में पास करने के कुछ अलग तरीके हैं, जो आप प्राप्त करने की कोशिश कर रहे हैं उस पर निर्भर करता है। यहां कुछ विधियां हैं, उदाहरणों के साथ:
getopts / फ्लैग विधि कमांड लाइन इनपुट पढ़ने की
- getopts एक शेल कमांड है जो कमांड लाइन इनपुट से विकल्प (या फ्लैग) प्राप्त करता है और उनके मान (या आर्गुमेंट) को आपकी स्क्रिप्ट में उपयोग के लिए उपलब्ध कराता है
- विकल्प एक डैश से पहले एक सिंगल लेटर होते हैं, उसके बाद पास करने का मान, जैसे -v value
- तब सबसे अच्छा उपयोग किया जाता है जब क्रम मायने नहीं रखता
- यहां सूचीबद्ध सभी विधियों में से शायद सबसे अच्छा
getopts Bash स्क्रिप्ट उदाहरण
यह उदाहरण स्क्रिप्ट फास्ट-फूड ऑर्डर के लिए तीन विकल्प लेती है:
- -o ऑर्डर के लिए
- -s साइज़ के लिए
- -d ड्रिंक के लिए
fastFoodOrder.sh
#!/bin/bash # विकल्प o, s, d के माध्यम से पार्स करने के लिए व्हाइल लूप का उपयोग करें while getopts o:s:d: flag do # प्रत्येक विकल्प (जिसे $flag वेरिएबल को असाइन किया गया है) को केस स्टेटमेंट ब्लॉक का उपयोग करके इसके अर्थ से मिलान करें # OPTARG getopts से संबंधित विकल्प के लिए प्राप्त मान होगा और फ्लैग के आधार पर एक वेरिएबल को असाइन किया जाता है case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; esac done # विकल्पों को पास किए गए मान अब उनके संबंधित वेरिएबल में उपलब्ध हैं echo "Order: $order";; echo "Size: $size";; echo "Drink: $drink";;
#!/bin/bash लाइन के बारे में अधिक जानने के लिए यहां क्लिक करें जो bash स्क्रिप्ट की शुरुआत में होती है।
इसे चलाने के लिए, निम्न दर्ज करें:
bash ./fastFoodOrder.sh -d Cola -o 'Fish Burger Meal' -s Large
जिसके परिणामस्वरूप स्क्रिप्ट आउटपुट करेगी:
Order: Fish Burger Meal Size: Large Drink: Cola
जैसा कि आप उपरोक्त आउटपुट में देख सकते हैं – विकल्पों को जिस क्रम में आपूर्ति की गई थी वह मायने नहीं रखता था।
स्क्रिप्ट निष्पादित करते समय ./ का उपयोग क्यों किया जाता है?
एक ही विकल्प को एकाधिक मान पास करना
एक ही विकल्प को एकाधिक मानों के लिए कई बार पास करना भी संभव है – वे तब स्क्रिप्ट में एक ऐरे के रूप में उपलब्ध होंगे।
यह एक सिंगल विकल्प को एकाधिक मान पास करने का सबसे अच्छा तरीका है क्योंकि यह मान में किसी भी कैरेक्टर के उपयोग की अनुमति देता है – मानों को कोट्स में पास करना या डिलीमीटर का उपयोग करना इसे सीमित करेगा।
fastFoodOrderExtras.sh
#!/bin/bash # विकल्प o, s, d, e के माध्यम से पार्स करने के लिए व्हाइल लूप का उपयोग करें while getopts o:s:d:e: flag do # प्रत्येक विकल्प (जिसे $flag वेरिएबल को असाइन किया गया है) को केस स्टेटमेंट ब्लॉक का उपयोग करके इसके अर्थ से मिलान करें # OPTARG getopts से संबंधित विकल्प के लिए प्राप्त मान होगा और फ्लैग के आधार पर एक वेरिएबल को असाइन किया जाता है case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; e) extras+=${OPTARG};;# एकाधिक एक्स्ट्रा मान पास करने के लिए ऐरे वेरिएबल बनाएं या जोड़ें esac done # विकल्पों को पास किए गए मान अब उनके संबंधित वेरिएबल में उपलब्ध हैं echo "Order: $order";; echo "Size: $size";; echo "Drink: $drink";; echo "The list of extras is '${extras[@]}'" # एकाधिक एक्स्ट्रा मानों के माध्यम से लूप for val in "${extras[@]}";; do echo $val done
उपरोक्त स्क्रिप्ट एक्स्ट्रा जोड़ने के लिए कई -e विकल्प स्वीकार करती है, जैसा कि नीचे देखा गया है:
bash ./fastFoodOrderExtras.sh -d Cola -o 'Fish Burger Meal' -s Large -e Sauce -e Salt -e Pepper
स्क्रिप्ट आउटपुट करेगी:
Order: Fish Burger Meal Size: Large Drink: Cola The list of extras is 'SauceSaltPepper' SauceSaltPepper
स्क्रिप्ट में पोजिशनल पैरामीटर का उपयोग करना
- तब उपयोग किया जाता है जब एक विशिष्ट क्रम में ज्ञात संख्या में आर्गुमेंट/पैरामीटर होंगे
- सरल स्क्रिप्ट के लिए सबसे अच्छा उपयोग किया जाता है
उदाहरण
fastFoodOrder.sh
#!/bin/bash echo "Order: $1";; echo "Size: $2";; echo "Drink: $3";;
इसे चलाने के लिए, निम्न दर्ज करें:
bash ./fastFoodOrder.sh 'Fish Burger Meal' Large Cola
जिसके परिणामस्वरूप स्क्रिप्ट आउटपुट करेगी:
Order: Fish Burger Meal Size: Large Drink: Cola
ध्यान दें कि यदि विकल्प क्रम से बाहर प्रदान किए गए थे, तो मान सभी मिश्रित हो जाएंगे। इस विधि का उपयोग करते समय स्थिति मायने रखती है!
bash ./fastFoodOrder.sh 'Fish Burger Meal' Cola Large
मानों को गलत तरीके से असाइन करने का परिणाम होगा:
Order: Fish Burger Meal Size: Cola Drink: Large
कमांड लाइन पैरामीटर पढ़ने के लिए लूप का उपयोग करना
- तब सबसे अच्छा उपयोग किया जाता है जब विकल्प/आर्गुमेंट की संख्या अग्रिम में ज्ञात नहीं होती है
- उदाहरण के लिए, आप एक रेसिपी के लिए सामग्री की सूची प्रदान कर रहे होंगे
- यह बिल्ट-इन वेरिएबल $@ का उपयोग करता है, जिसमें उपयोगकर्ता द्वारा आपूर्ति किए गए सभी इनपुट विकल्पों का एक ऐरे होता है
उदाहरण
recipe.sh
#!/bin/bash i=1; # यह मान पुनरावृत्ति मान है - पूर्ण हुए लूप की वर्तमान संख्या for ingredient in "$@" # $@ के माध्यम से लूप करें जो पास किए गए सभी इनपुट पैरामीटर का एक ऐरे है do echo "Ingredient number $i is $ingredient";;# $ingredient प्रिंट करें जो स्क्रिप्ट को कॉल करते समय पास किया गया था i=$((i + 1)); # पुनरावृत्ति मान बढ़ाएं ताकि हम जान सकें कि हमने कितनी बार लूप किया है done
इसे चलाएं:
sh ./recipe.sh bread lettuce cheese hamburger
जो आउटपुट करेगा:
Ingredient number 1 is bread Ingredient number 2 is lettuce Ingredient number 3 is cheese Ingredient number 4 is hamburger