शेल स्क्रिप्ट चलाते समय, क्या उन सभी में प्रवेश करने के लिए विशिष्ट स्थितिगत मापदंडों को पारित करना संभव है?


13

उदाहरण के लिए, यदि मेरे पास स्क्रिप्ट है। / यदि यह 10 पैरामीटर लेता है, और मैं केवल 8 वीं पास करना चाहता हूं। एकमात्र तरीका मुझे पता है कि वर्तमान में यह कैसे करना है:

./foo '' '' '' '' '' '' '' 'bar'

क्या कोई आसान / बेहतर तरीका है?


1
यही कारण है कि यदि आपके पास बहुत सारे पैरामीटर हैं, तो प्रोग्राम आमतौर पर स्थितीय मापदंडों के बजाय विकल्पों का उपयोग करते हैं।
बरमार

जवाबों:


4

इस चीज़ को करने का एक और तरीका यह है कि आप जिस पैरामीटर को घोषित करना चाहते हैं उसका नाम रखें और फिर ऐसा करें:

{   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 मेरे परीक्षण निर्देशिका से ग्लोबेड हैं।


18

यह मानते हुए कि आप स्क्रिप्ट को बदल सकते हैं, आपको आवश्यक मापदंडों (तर्कों) के बजाय वैकल्पिक मापदंडों (विकल्पों) का उपयोग करने पर विचार करना चाहिए।

यदि आपके पास विकल्प के रूप में पहले 7 सात मापदंडों में से प्रत्येक है, और उन्हें खाली स्ट्रिंग के लिए डिफ़ॉल्ट है तो आप बस कर सकते हैं:

./foo bar

यदि आप POSIX- संगत शेल का उपयोग करते हैं तो आप getoptsउपयोगिता, या प्रोग्राम का उपयोग कर सकते हैं getoptbash- अधिकांश गोले की तरह - getoptsएक अंतर्निहित के रूप में प्रदान करता है। किसी भी तरह से अपनी खुद की कमांड-लाइन पार्सर को रोल करने से आसान है।

जब तक कि आप अंतिम X गैर-विकल्प तर्क जैसी किसी चीज़ को लागू नहीं करते हैं, अंतिम Y तर्क और XY विकल्प तर्क के मान हैं, यदि आपको उनमें से कोई भी सेट करना है तो 7 (अब खाली) स्ट्रिंग में से प्रत्येक से पहले विकल्प स्ट्रिंग प्रदान करना होगा। हालांकि यह सामान्य अभ्यास नहीं है, आम तौर पर एक विकल्प हमेशा एक विकल्प और एक तर्क होता है, और विकल्प "सम्मिलन" का क्रम मुफ़्त है।


5
+1के लिए getopt(s)। स्थितिगत पैरामीटर एक दुखद समय है, और इससे बचा जाना चाहिए।
हेलोसॉस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.