2013-01-21 43 views
48

मैं एक खोल स्क्रिप्ट जो इस तरह चलाने के लिए डिज़ाइन किया गया है बनाने के लिए कोशिश कर रहा हूँ हड़पने:बैश शेल स्क्रिप्ट - एक ध्वज के लिए जाँच करें और अपने मूल्य

script.sh -t application 

सबसे पहले, मेरी स्क्रिप्ट में मैं देखने के लिए जाँच करना चाहते हैं अगर स्क्रिप्ट को ध्वज के साथ चलाया गया है। उदाहरण के लिए अगर यह इस तरह झंडा मैं इसे त्रुटि के लिए चाहते हैं के बिना चलाया जा रहा है:

script.sh 

दूसरे, यह सोचते हैं एक आयकर झंडा हो तो मैं मूल्य हड़पने और एक चर में संग्रहीत करना चाहते हैं कि मैं यह कर सकते हैं इस तरह के उदाहरण के लिए मेरी स्क्रिप्ट में उपयोग करें:

FLAG="application" 

अब तक केवल प्रगति मैं इस में से किसी पर बनाने के लिए सक्षम किया गया है कि $ @ सभी आदेश पंक्ति तर्क पकड़ लेता है, लेकिन मैं यह कैसे पता नहीं है है झंडे से संबंधित है, या यदि यह भी संभव है।

+0

संभावित डुप्लिकेट इस पाठ ले लिया [कैसे कर मैं बैश में कमांड लाइन तर्कों का विश्लेषण करता हूं?] (Http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) – Jaketr00

उत्तर

82

आपको यह getopts ट्यूटोरियल पढ़ना चाहिए। (! getopt = getopts)

#!/bin/bash 

while getopts ":a:" opt; do 
    case $opt in 
    a) 
     echo "-a was triggered, Parameter: $OPTARG" >&2 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 

greybot की तरह कहा:

The external command getopt(1) is never safe to use, unless you know it is GNU getopt, you call it in a GNU-specific way, and you ensure that GETOPT_COMPATIBLE is not in the environment. Use getopts (shell builtin) instead, or simply loop over the positional parameters.

+0

क्या यह भी खोल के लिए काम करता है? – Jimmy

+1

'गेटोपेट्स 'एक' बाश 'अंतर्निहित है, लेकिन बाहरी' गेटोप्ट 'प्रोग्राम भी है जो किसी भी POSIX- संगत शैल के साथ काम करना चाहिए। – chepner

+3

बाहरी कमांड getopt (1) उपयोग करने के लिए कभी भी सुरक्षित नहीं है, जब तक कि आप * यह नहीं जानते कि यह जीएनयू गेटोपट है, आप इसे जीएनयू-विशिष्ट तरीके से कहते हैं, * और * आप सुनिश्चित करते हैं कि GETOPT_COMPATIBLE पर्यावरण में नहीं है। बजाय गेटोपेट्स (खोल निर्मित) का उपयोग करें, या बस स्थितित्मक पैरामीटर पर लूप का उपयोग करें। –

22

उपयोग $#, तर्क की संख्या हड़पने के लिए अगर यह असमान है

-a स्विच कि एक बहस की आवश्यकता है के साथ उदाहरण 2 तक पर्याप्त तर्क उपलब्ध नहीं हैं:

if [ $# -ne 2 ]; then 
    usage; 
fi 

अगला, देखें कि क्या $1-t के बराबर होती है, अन्यथा एक अज्ञात झंडा इस्तेमाल किया गया था:

if [ "$1" != "-t" ]; then 
    usage; 
fi 

अंत में स्टोर FLAG में $2:

FLAG=$2 

नोट: usage() कुछ वाक्य रचना दिखा कार्य है। उदाहरण के लिए:

function usage { 
    cat << EOF 
Usage: script.sh -t <application> 

Performs some activity 
EOF 
    exit 1 
} 
0

यूनिक्स शैल स्क्रिप्ट के लिए उन्नत कमांड लाइन ध्वज लाइब्रेरी का प्रयास करें।

http://code.google.com/p/shflags/

यह बहुत अच्छी और बहुत लचीला है।

फ्लैग प्रकार: यह डेफिन _ * की एक सूची है जिसे आप कर सकते हैं। सभी ध्वज एक नाम, डिफ़ॉल्ट मान, सहायता-स्ट्रिंग, और वैकल्पिक 'संक्षिप्त' नाम (एक-अक्षर नाम) लेते हैं। कुछ झंडे में अन्य तर्क होते हैं, जिन्हें ध्वज के साथ वर्णित किया जाता है।

DEFINE_string: कोई इनपुट लेता है, और इसे एक स्ट्रिंग के रूप में intreprets।

DEFINE_boolean: आम तौर पर कोई तर्क नहीं लेता है: कहते हैं --myflag FLAGS_myflag को सत्य, या --nomyflag को FLAGS_myflag को गलत पर सेट करने के लिए सेट करें। वैकल्पिक रूप से, आप --myflag = true या --myflag = t या --myflag = 0 या --myflag = false या --myflag = f या --myflag = 1 एक विकल्प पास करना एक ही है विकल्प को एक बार पास करने के रूप में प्रभावित करें।

DEFINE_float: एक इनपुट लेता है और इसे फ़्लोटिंग पॉइंट नंबर के रूप में सूचित करता है। शेल प्रति-फ्लोट्स का समर्थन नहीं करता है, इनपुट केवल मान्य फ़्लोटिंग पॉइंट मान होने के रूप में मान्य है।

DEFINE_integer: एक इनपुट लेता है और इसे पूर्णांक के रूप में अंतर्निहित करता है।

विशेष FLAGS: वहाँ कुछ झंडे कि विशेष अर्थ नहीं होता हैं: --help (? या -) एक मानव पठनीय फैशन --flagfile = foo foo से झंडे को पढ़ने में सभी झंडे की एक सूची प्रिंट करता है। (अभी तक लागू नहीं) - getopt() के रूप में, झंडा प्रसंस्करण समाप्त हो जाता है

उपयोग का उदाहरण:

-- begin hello.sh -- 
! /bin/sh 
. ./shflags 
DEFINE_string name 'world' "somebody's name" n 
FLAGS "[email protected]" || exit $? 
eval set -- "${FLAGS_ARGV}" 
echo "Hello, ${FLAGS_name}." 
-- end hello.sh -- 

$ ./hello.sh -n Kate 
Hello, Kate. 

नोट: मैं shflags प्रलेखन से की