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

Bla*_*ank 12 bash shell getopts

我的shell脚本非常简单,如下所示:

  while getopts "abc:" flag; do
         echo "$flag" $OPTIND $OPTARG
  done
Run Code Online (Sandbox Code Playgroud)

我做了一些测试如下:

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
Run Code Online (Sandbox Code Playgroud)

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

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

per*_*eal 15

根据man getopts,OPTIND是要处理的下一个参数的索引(起始索引是1).因此,

sh foo.sh -abc CCC Blankarg1中-abc,所以在a我们仍在解析arg1时,next是b(a 1).当下一个是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 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.