2013-01-10 20 views
6

मेरे खोल स्क्रिप्ट काफी सरल है में OPTIND चर काम करते हैं, निम्नलिखित के रूप में:कैसे खोल builtin getopts

while getopts "abc:" flag; do 
     echo "$flag" $OPTIND $OPTARG 
    done 

और मैं निम्नलिखित के रूप में कुछ परीक्षण करना:

[email protected]:~/lab/shell/getopts_go$ sh foo.sh -abc CCC Blank 
a 1 
b 1 
c 3 CCC 

[email protected]:~/lab/shell/getopts_go$ sh foo.sh -a -b -c CCC Blank 
a 2 
b 3 
c 5 CCC 

[email protected]:~/lab/shell/getopts_go$ sh foo.sh -ab -c CCC Blank 
a 1 
b 2 
c 4 CCC 

[email protected]:~/lab/shell/getopts_go$ sh foo.sh -a -bc CCC Blank 
a 2 
b 2 
c 4 CCC 

मैं नहीं कर सकता समझें कि कैसे OPTIND विभिन्न कमांड लाइन आमंत्रण के साथ काम करता है, मैं आउटपुट द्वारा उलझन में हूं।

क्या आप OPTIND कंप्यूटिंग के तंत्र को समझने में मदद कर सकते हैं?

+0

OPTIND –

उत्तर

11

man getopts के अनुसार, OPTIND संसाधित होने के लिए अगले तर्क की अनुक्रमणिका है (इंडेक्स 1 शुरू करना) है। इसलिए,

में sh foo.sh -abc CCC Blank ARG1 -abc है, इसलिए a के बाद हम अभी भी ARG1 को पार्स कर रहे हैं जब अगले b (a 1) है। जब c है, तब भी वही सच है, हम अभी भी arg1 (b 1) में हैं। जब हम c पर हैं, c के बाद एक तर्क (CCC) OPTIND3 है (arg2 सीसीसी है और हम इसे छोड़ देते हैं)।

sh foo.sh -a -b -c CCC Blank में, ARG1 a है, ARG2 b है, arg3 c है, और arg4 CCC है। तो हमें a 2, b 3, c 5 मिलता है।

sh foo.sh -ab -c CCC Blank में आर्ग हैं (1: -ab, 2: -c, 3: CCC और 4: Blank)। तो हम पाते हैं: a 1, b 2, c 4

sh foo.sh -a -bc CCC Blank में आर्ग हैं (1: -a, 2: -bc, 3: CCC, 4: Blank) और हम a 2, b 2, c 4 मिलता है।

+0

समझने के लिए उत्कृष्ट परीक्षण स्क्रिप्ट वास्तव में आपकी व्याख्या की सराहना करते हुए, यह मुझे बहुत परेशान करता है। यह पता चला है कि मैं अगले तर्क के अर्थ से उलझन में हूं। – Blank