我的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
吗?
答案 0 :(得分:14)
根据man getopts
,OPTIND
是要处理的下一个参数的索引(起始索引为1)。因此,
在sh foo.sh -abc CCC Blank
中,arg1为-abc
,因此在a
之后我们仍在解析arg1,而下一个是b
(a 1
)。当next是c
时,我们仍然在arg1(b 1
)中也是如此。当我们在c
时,由于c
需要参数(CCC
),OPTIND
为3
(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 }}