15

我的shell脚本很简单,如下:

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

我做了一些测试如下:

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -abc CCC Blank
a 1
b 1
c 3 CCC

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -a -b -c CCC Blank
a 2
b 3
c 5 CCC

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -ab -c CCC Blank
a 1
b 2
c 4 CCC

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -a -bc CCC Blank
a 2
b 2
c 4 CCC

我无法理解如何OPTIND使用不同的命令行调用,我对输出感到困惑。

你能帮忙弄清楚计算的机制OPTIND吗?

4

1 回答 1

19

根据man getoptsOPTIND是下一个要处理的参数的索引(起始索引为 1)。因此,

sh foo.sh -abc CCC Blankarg1 is 中-abc,所以当 next is ( )a时我们仍在解析 arg1 。next is 时也是如此,我们仍在 arg1 ( ) 中。当我们在 时,因为需要一个参数 ( ),所以是(arg2 是 CCC,我们跳过它)。ba 1cb 1ccCCCOPTIND3

sh foo.sh -a -b -c CCC Blank中,arg1 是aarg2 是barg3 是carg4 是CCC。所以我们得到a 2, b 3, c 5.

sh foo.sh -ab -c CCC Blankargs 中是 (1: -ab, 2: -c, 3:CCC和 4: Blank)。所以我们得到:a 1, b 2, c 4

sh foo.sh -a -bc CCC Blankargs 中是 (1: -a, 2: -bc, 3: CCC, 4: Blank) 我们得到a 2, b 2, c 4.

于 2013-01-10T03:42:49.080 回答