गैर-विकल्प तर्क के बाद विकल्पों को पार्स करने के लिए गेटटॉप का उपयोग करना


10

मेरे पास एक फ़ाइल में नीचे की तरह एक bash स्क्रिप्ट है nepleaks_upd.sh, जिसे मैं चलाना चाहता हूं ./nepleaks_upd.sh bootstrap --branch off। इसे लेने के लिए नहीं बना सकता है --branch, लेकिन इसके साथ क्या काम करता है ./nepleaks_upd.sh bootstrap -b off

usage() { echo "Usage: $0 [prepare | up | down]  [-b <on/off>]" 1>&2; exit 1; }                                                                                                 

case "$1" in                                                                                           
               bootstrap)                                                                                  
                  while getopts ":b:" o; do                                                            
                   case "${o}" in                                                                      
                    b)                                                                                 
                        b=${OPTARG}                                                                    
                        if [ ${b} == "off" ]; then                                                      
                               echo "git clone https://github.com/iPrayag/dotfiles.git"  
                               ## logic                                                      
                        fi                                                                             
                        ;;                                                                             
                    *)                                                                                 
                        echo ${o}                                                                      
                        usage                                                                          
                        ;;                                                                             
                   esac                                                                                
                  done                                                                                 
                  shift $((OPTIND-1))                                                                  
                  echo "option1 = ${o}" 
                  echo "option2 = ${b}"                                                                      
                  if [ -z "${b}" ]; then                                                               
                         usage                                                                         
                  fi                                                                                   

                    ;;                                                                                 
                up)                                                                                         
                     echo "up"     
                     ##logic                                                                    
                     ;;                                                                                
                down)                                                                                  
                     echo "down" 
                     ##logic                                                                     
                    ;;                                                                                 
                *)                                                                                     
                    echo "Usage: $0 {up | down} dev"                                                
                    exit 1                                                                             
                    ;;                                                                                 
esac         

पहले बिना case .. in .... esac, यह ठीक काम करता है। इसके साथ case ... in ... esac, यह रिक्त विकल्प देता है -b,

$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 = 
Usage: ./nepleaks_upd.sh [bootstrap | up | down]  [-b <on/off>]

उपयोग करने से पहले क्या आपको विकल्पों की जांच नहीं करनी चाहिए $1?
21

@unxnut यह samething गाती भाई
prayagupd

"पहले के बिना case .. in .... esac, यह ठीक काम करता है" से आपका क्या मतलब है ? क्या आपका मतलब है कि 5-25 पार्स लाइनों को ./nepleaks_upd.sh -b offसही ढंग से? हो सकता है कि आपको इसकी आवश्यकता हो shift, इसलिए getopts" bootstrap" पर झूमना न पड़े ।
स्कॉट

@ ठीक है, ठीक वही हिस्सा ठीक काम करता है।
प्रयागपाद

जवाबों:


12

getoptsपहले तर्क में पार्स करना शुरू करता है और पहले गैर-विकल्प तर्क पर रुक जाता है। यही कारण है कि मानक सम्मेलन है - कुछ जीएनयू उपयोगिताओं तर्क के बाद विकल्पों को स्वीकार है, लेकिन सामान्य बात यह है कि में है somecommand foo -bar qux, -barएक विकल्प के रूप में पार्स नहीं कर रहा है।

यदि आप के बाद पार्सिंग विकल्प शुरू करना चाहते हैं bootstrap, तो आपको यह संकेत देना होगा। यह किस स्थिति में है, यह याद रखने के getoptsलिए OPTINDचर का उपयोग करता है । OPTINDमान 1 से शुरू होता है। पहला तर्क छोड़ने के लिए, इसे 2 पर सेट करें।

case "$1" in
   bootstrap)
      OPTIND=2
      while getopts ":b:" o; do
          

वैकल्पिक रूप से, आप shiftउन तर्कों को स्वीकार कर सकते हैं जिन्हें आपने पहले ही संसाधित किया है।

subcommand=$1; shift
case "$subcommand" in
    bootstrap)
      while getopts ":b:" o; do
          
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.