2010-05-20 12 views
23

में कमांड लाइन ध्वज की जांच करने का सही तरीका एक स्क्रिप्ट के बीच में, मैं यह जांचना चाहता हूं कि कमांड लाइन पर दिया गया ध्वज पारित किया गया हो या नहीं। निम्नलिखित जो मैं चाहता करती है, लेकिन बदसूरत लगता है:बैश

if echo $* | grep -e "--flag" -q 
then 
    echo ">>>> Running with flag" 
else 
    echo ">>>> Running without flag" 
fi 

वहाँ एक बेहतर तरीका है?

नोट: मैं स्पष्ट रूप से स्विच/गेटोपट में सभी झंडे सूचीबद्ध करना चाहता हूं। (इस मामले में ऐसी कोई चीजें पूर्ण स्क्रिप्ट का आधा या अधिक हो जाएंगी। इसके अलावा यदि शरीर केवल वर्रों का एक सेट सेट करता है)

उत्तर

4

आप बैश में गेटोपट कीवर्ड का उपयोग कर सकते हैं।

http://aplawrence.com/Unix/getopts.html से:

getopt

यह एक स्टैंडअलोन निष्पादन योग्य है कि एक लंबे समय के आसपास किया गया है है। पुराने संस्करणों में उद्धृत तर्कों को संभालने की क्षमता की कमी है (एक "यह काम नहीं करेगा" सी) और संस्करण जो कर सकते हैं, इतनी गड़बड़ी कर सकते हैं। यदि आप हाल ही में लिनक्स संस्करण चला रहे हैं, तो आपका "getopt" ऐसा कर सकता है; एससीओ ओएसआर 5, मैक ओएस एक्स 10.2.6 और फ्रीबीएसडी 4.4 में एक पुराना संस्करण है जो नहीं करता है।

"getopt" के सरल उपयोग इस छोटे-लिपि में दिखाया गया है:

#!/bin/bash 
echo "Before getopt" 
for i 
do 
    echo $i 
done 
args=`getopt abc:d $*` 
set -- $args 
echo "After getopt" 
for i 
do 
    echo "-->$i" 
done 
+0

बाह्य 'getopt' के बजाय बिल्टिन' गेटोपेट्स 'का उपयोग करना बेहतर है। –

+0

@ डेनिस: 'गेटोपेट्स' लंबे विकल्प नामों का समर्थन करता है जैसे '--flag'? – indiv

+0

@indiv: ओह, क्षमा करें, मैंने उस आवश्यकता को अनदेखा किया। मैं 'getopt' का उपयोग करने से पहले 'केस' कथन का उपयोग करूंगा। 'Getopt' और' getopts' की तुलना के लिए [this] (http://aplawrence.com/Unix/getopts.html) देखें। –

4

मैं आम तौर पर इस एक मामले बयान के साथ किया देखें। यहाँ git-repack स्क्रिप्ट से एक अंश है:

while test $# != 0 
do 
    case "$1" in 
    -n) no_update_info=t ;; 
    -a) all_into_one=t ;; 
    -A) all_into_one=t 
     unpack_unreachable=--unpack-unreachable ;; 
    -d) remove_redundant=t ;; 
    -q) GIT_QUIET=t ;; 
    -f) no_reuse=--no-reuse-object ;; 
    -l) local=--local ;; 
    --max-pack-size|--window|--window-memory|--depth) 
     extra="$extra $1=$2"; shift ;; 
    --) shift; break;; 
    *) usage ;; 
    esac 
    shift 
done 

ध्यान दें कि यह आप दोनों छोटी और लंबी झंडे के लिए जाँच करने के लिए अनुमति देता है। अन्य विकल्पों को इस मामले में extra चर का उपयोग करके बनाया गया है।

+0

मुझे लगता है कि आपको 'esac' के ठीक बाद, अंतिम 'शिफ्ट' कथन को हटाना होगा। कम से कम मेरी मशीन पर यह काम नहीं करता है अगर यह मौजूद है। –

37

एक वैकल्पिक आप क्या कर रहे हैं:

if [[ $* == *--flag* ]] 

भी देखें BashFAQ/035

+0

क्या वह झूठी सकारात्मक भी नहीं उठाएगा? जैसे यदि आप '* -f *' के लिए चेक करते हैं तो यह '--force', '-fish',' --update-files',' -w-t-f'etc – nathanchere

+0

@nathanchere से मेल खाएगा: मिलान स्ट्रिंग की सावधानीपूर्वक पसंद महत्वपूर्ण है। ध्यान दें कि आपका उदाहरण आपके द्वारा सूचीबद्ध सभी मैचों की अनुमति देता है लेकिन मेरा झूठी सकारात्मकताओं की बहुत कम संभावनाएं छोड़ देता है। एक साधारण समाधान खान के लिए ओपी की आवश्यकता को देखते हुए काफी अच्छी तरह से फिट बैठता है। अन्यथा Getopt या getopts का उपयोग करें। –

+0

बिल्कुल मेरी बात।मेरा एक जानबूझकर सरलीकृत उदाहरण था, लेकिन फिर भी आपके साथ एक ही समस्या का प्रदर्शन करता है। जैसे यदि आप '* - ध्वज *' का उपयोग करते हैं, तो आप '--flag', '--flags-off' आदि से मेल खाते हैं यानी यह एक मैला समाधान – nathanchere