2013-02-20 36 views
8

मेरे पास स्क्रिप्ट है जहां मुझे स्क्रिप्ट निष्पादित करते समय उपयोगकर्ता को अनिवार्य जानकारी याद करने पर उपयोग कमांड प्रदर्शित करने की आवश्यकता होती है।गेटपेट के बिना खोल स्क्रिप्ट में उपयोग सामग्री जोड़ें

Usage : Script -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value> 
चर फैशन नीचे के रूप में तर्क से सभी OPTIONS

मैं हो रही है मूल्यों के बारे में स्पष्टीकरण के साथ

। लेकिन मैं इस प्रयोग को खोल स्क्रिप्ट में सत्यापन के साथ चाहता हूं।

SERVER=$1 
INSTANCE=$2 
USER=$3 
DB_PASSWD=$4 
QUERY=$5 
VAL_WARN=$6 
VAL_CRIT=$7 

मैं getopts उपयोग करने की कोशिश की है, लेकिन <query> के बाद से उपयोग करने के लिए मूल्य पार करने से पहले एक -q पैरामीटर नहीं होता है असफल रहा।

मैंने अन्य सभी तरीकों को खोजने का प्रयास किया है, लेकिन हर किसी ने गेटोपेट का सुझाव दिया जो मेरे लिए व्यवहार्य समाधान नहीं है।

कृपया मुझे इस पर मदद ..

+1

विकल्प अक्षरों की योग्यता में से एक यह है कि यह उपयोगकर्ता को किसी भी क्रम में आइटम रखने की अनुमति देता है। अगर आदेश तय किया गया है, तो '-s' जैसे विकल्पों से परेशान करने की कोई आवश्यकता नहीं है; जो उपयोगकर्ता को अनिवार्य रूप से कोई लाभ नहीं देता है। मुझे लगता है कि कच्चे कमांड लाइन में सर्वर स्ट्रिंग '$ 2' (' $ 1' नहीं) है। क्या आप अपने आदेश को नियमित नहीं कर सकते हैं ताकि '-q' की आवश्यकता हो, या तो क्वेरी अंतिम तर्क है? क्या किसी भी विकल्प में समझदार डिफ़ॉल्ट हैं? यदि ऐसा है, तो उपयोगकर्ता के 13 तर्कों की मांग करने के बजाय उनका उपयोग करें। आपके उपयोगकर्ता आपको धन्यवाद देंगे, और आपकी स्क्रिप्ट लिखना आसान होगा। –

उत्तर

20

उपयोग पारी अपने सभी तर्क के माध्यम से पुनरावृति करने के लिए, की तरह कुछ:

#!/bin/sh 

usage() 
{ 
    echo 'Usage : Script -s <server> -i <instance> -u <user> -p <password>' 
    echo '     <query> -w <warning value> -c <critical value>' 
    exit 
} 

if [ "$#" -ne 13 ] 
then 
    usage 
fi 

while [ "$1" != "" ]; do 
case $1 in 
     -s)   shift 
         SERVER=$1 
         ;; 
     -i)   shift 
         INSTANCE=$1 
         ;; 
     -u)   shift 
         USER=$1 
         ;; 
     -p)   shift 
         PASSWORD=$1 
         ;; 
     -w)   shift 
         WARNINGVAL=$1 
         ;; 
     -c)   shift 
         CRITICVAL=$1 
         ;; 
     *)   QUERY=$1 
    esac 
    shift 
done 

# extra validation suggested by @technosaurus 
if [ "$SERVER" = "" ] 
then 
    usage 
fi 
if [ "$INSTANCE" = "" ] 
then 
    usage 
fi 
if [ "$USER" = "" ] 
then 
    usage 
fi 
if [ "$PASSWORD" = "" ] 
then 
    usage 
fi 
if [ "$QUERY" = "" ] 
then 
    usage 
fi 
if [ "$WARNINGVAL" = "" ] 
then 
    usage 
fi 
if [ "$CRITICVAL" = "" ] 
then 
    usage 
fi 

echo "ALL IS WELL. SERVER=$SERVER,INSTANCE=$INSTANCE,USER=$USER,PASSWORD=$PASSWORD,QUERY=$QUERY,WARNING=$WARNINGVAL,CRITIC=$CRITICVAL" 

चाल करना चाहिए।

संपादित करें: लिपि में जोड़ा तर्क सत्यापन @technosaurus

+0

सिर्फ अंत में चेक की आवश्यकता है '[! "$ PASSWORD"] && उपयोग' # और अन्य अनिवार्य तर्कों के लिए समान – technosaurus

+0

@technosaurus AFAICS जो जांच पहले से मौजूद है: 'जबकि ["$ 1"! = ""] ...' –

+0

यह अभी भी 'स्क्रिप्ट क्यू क्यू क्यू क्यू क्यू क्यू क्यू क्यू क्यू क्यू क्यू क्यू क्यू' काम करेगा और आवश्यक मानों में से कोई भी – technosaurus

1

getopts द्वारा सुझाए गए के रूप में एक good reason के लिए bitching है। लोगों की अपेक्षा के अनुरूप आपको अपनी स्क्रिप्ट का इंटरफ़ेस बदलना चाहिए।

वैकल्पिक रूप से, आप getopts दो बार उपयोग कर सकते हैं, पहले प्री -query विकल्प, shift, फिर बाकी के लिए।

1

इस बाहर की कोशिश

usage() 
{ 
    echo "$0 -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>" 
} 

for i in {0..12} 
do 
    arg=`expr $i +1` 
    test ! "${!arg}" && usage && break 
done 

आशा है कि यह मदद करता है

+1

या आप {1..13} में 'के लिए' और 'सबहेल से छुटकारा पा सकते हैं। –

0

यह एक गैर मानक दृष्टिकोण है, लेकिन एक है कि मैं बहुत ही उपयोगी पाते हैं। विशिष्ट झंडे के तर्कों के रूप में मूल्यों को पारित करने के बजाय (जो काफी परेशान है; उपयोगकर्ता को प्रत्येक मान निर्दिष्ट करने की आवश्यकता नहीं है, लेकिन उचित डिफ़ॉल्ट आपूर्ति की जानी चाहिए), आप उन्हें सीधे पर्यावरण के माध्यम से सीधे पास कर सकते हैं, ताकि एक सामान्य कॉल दिखाई दे जैसे:

SERVER=blah INSTANCE=foo Script 

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