उदाहरण के लिए, यदि मेरे पास स्क्रिप्ट है। / यदि यह 10 पैरामीटर लेता है, और मैं केवल 8 वीं पास करना चाहता हूं। एकमात्र तरीका मुझे पता है कि वर्तमान में यह कैसे करना है:
./foo '' '' '' '' '' '' '' 'bar'
क्या कोई आसान / बेहतर तरीका है?
उदाहरण के लिए, यदि मेरे पास स्क्रिप्ट है। / यदि यह 10 पैरामीटर लेता है, और मैं केवल 8 वीं पास करना चाहता हूं। एकमात्र तरीका मुझे पता है कि वर्तमान में यह कैसे करना है:
./foo '' '' '' '' '' '' '' 'bar'
क्या कोई आसान / बेहतर तरीका है?
जवाबों:
इस चीज़ को करने का एक और तरीका यह है कि आप जिस पैरामीटर को घोषित करना चाहते हैं उसका नाम रखें और फिर ऐसा करें:
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
उपरोक्त उदाहरण में स्पष्ट रूप से घोषित पर्यावरण चर को कमांड-लाइन तर्क के लिए पसंद किया जाता है, लेकिन कमांड-लाइन तर्क का उपयोग तब किया जाता है जब पर्यावरण चर या तो खाली या परेशान होता है। जब 8 वीं स्थिति और पर्यावरण चर $eight
दोनों खाली होते हैं या डिफ़ॉल्ट मान को अनसेट करते हैं तो some_default को सौंपा जाता है $eight
। या तो मामले में या बयानों :
से हटाया जा सकता है अगर खाली एक स्वीकार्य मूल्य होना चाहिए।:-
:=
चर के $eight
रूप में अच्छी तरह से सेट किया जा सकता है:
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... और पिछली पंक्ति पूरी तरह से छोड़ दी गई थी, लेकिन मैं यह प्रदर्शित करना चाहता था कि उस तरह से एक चर घोषित करने से लगातार मूल्य होता है, और इसलिए मैंने इसे दो आदेशों में किया। किसी भी तरह $eight
से उस कंपाउंड पैरामीटर विस्तार के अंतिम मूल्य पर सेट किया जाता है।
getopts
- मजबूत स्क्रिप्ट के लिए - अक्सर कमांड विकल्पों को संभालने का सबसे अच्छा तरीका है । स्थितीय मापदंडों, दूसरे हाथ पर, लगभग हमेशा मजबूती के साथ निपटने का सबसे सरल साधन हैं ऑपरेंड एक स्क्रिप्ट में।
उदाहरण के लिए:
touch file$(seq -ws\ file 100)
./foo *
$eight = file008
वहाँ हम केवल आठवें ऑपरेंड को देखते हैं, लेकिन उनमें से 101 मेरे परीक्षण निर्देशिका से ग्लोबेड हैं।
यह मानते हुए कि आप स्क्रिप्ट को बदल सकते हैं, आपको आवश्यक मापदंडों (तर्कों) के बजाय वैकल्पिक मापदंडों (विकल्पों) का उपयोग करने पर विचार करना चाहिए।
यदि आपके पास विकल्प के रूप में पहले 7 सात मापदंडों में से प्रत्येक है, और उन्हें खाली स्ट्रिंग के लिए डिफ़ॉल्ट है तो आप बस कर सकते हैं:
./foo bar
यदि आप POSIX- संगत शेल का उपयोग करते हैं तो आप getopts
उपयोगिता, या प्रोग्राम का उपयोग कर सकते हैं getopt
। bash
- अधिकांश गोले की तरह - getopts
एक अंतर्निहित के रूप में प्रदान करता है। किसी भी तरह से अपनी खुद की कमांड-लाइन पार्सर को रोल करने से आसान है।
जब तक कि आप अंतिम X गैर-विकल्प तर्क जैसी किसी चीज़ को लागू नहीं करते हैं, अंतिम Y तर्क और XY विकल्प तर्क के मान हैं, यदि आपको उनमें से कोई भी सेट करना है तो 7 (अब खाली) स्ट्रिंग में से प्रत्येक से पहले विकल्प स्ट्रिंग प्रदान करना होगा। हालांकि यह सामान्य अभ्यास नहीं है, आम तौर पर एक विकल्प हमेशा एक विकल्प और एक तर्क होता है, और विकल्प "सम्मिलन" का क्रम मुफ़्त है।
+1
के लिए getopt(s)
। स्थितिगत पैरामीटर एक दुखद समय है, और इससे बचा जाना चाहिए।