2013-01-10 8 views
6
skrypt

Moja skorupa jest dość prosta, jak następuje:jaki sposób OPTIND zmienna praca w powłoce wbudowane getopts

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

I zrobić kilka testów, jak następuje:

[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 

nie mogę zrozumieć, jak działa OPTIND z innym wywołaniem wiersza poleceń, jestem zdezorientowany przez dane wyjściowe.

Czy możesz pomóc w ustaleniu mechanizmu obliczania OPTIND?

+0

Doskonały skrypt testowy do zrozumienia OPTIND –

Odpowiedz

11

Zgodnie z man getopts, OPTIND jest indeksem następnego argumentu do przetworzenia (indeks początkowy to 1). Stąd

W sh foo.sh -abc CCC Blank arg1 jest -abc, więc po a wciąż parsowania ARG1 gdy obok jest b (a 1). Tak samo jest, gdy następnym razem jest c, nadal jesteśmy w arg1 (b 1). Kiedy jesteśmy pod numerem c, ponieważ c potrzebuje argumentu (CCC), OPTIND jest 3 (arg2 to CCC, a my pomijamy).

W sh foo.sh -a -b -c CCC Blank, arg1 jest a, arg2 jest b, arg3 jest c i arg4 jest CCC. Otrzymujemy więc a 2, b 3, c 5.

W sh foo.sh -ab -c CCC Blank argumenty są (1: -ab, 2: -c, 3: CCC 4: Blank). Otrzymujemy: a 1, b 2, c 4.

W sh foo.sh -a -bc CCC Blank args są (1: -a, 2: -bc, 3: CCC, 4: Blank) i otrzymujemy a 2, b 2, c 4.

+0

Naprawdę doceniam twoje wyjaśnienie, bardzo mi to przeszkadza. Okazuje się, że jestem zdezorientowany przez znaczenie następnego argumentu. – Blank

Powiązane problemy