在shell内置命令getopts中,OPTIND变量如何工作

21

我的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的机制?


3
优秀的测试脚本,帮助理解OPTIND。 - RKA
1个回答

25
根据man getoptsOPTIND 是下一个要处理的参数的索引(起始索引为1)。所以,在 sh foo.sh -abc CCC Blank 中,arg1 是 -abc,所以在遇到 b 时仍然解析 arg1 (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 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

1
非常感谢您的解释,这让我受益匪浅。事实证明,我对下一个参数的含义感到困惑。 - Blank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接