OPTIND变量如何在shell内置的getopts中工作

时间:2013-01-10 02:31:25

标签: bash shell getopts

我的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吗?

1 个答案:

答案 0 :(得分:14)

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

sh foo.sh -abc CCC Blank中,arg1为-abc,因此在a之后我们仍在解析arg1,而下一个是ba 1)。当next是c时,我们仍然在arg1(b 1)中也是如此。当我们在c时,由于c需要参数(CCC),OPTIND3(arg2为CCC,我们会跳过它)。

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 args中(1:-ab,2:-c,3:CCC和4:Blank)。所以我们得到:a 1, b 2, c 4

sh foo.sh -a -bc CCC Blank args中(1:-a,2:-bc,3:CCC,4:Blank),我们得到{{1 }}