Skip to content

GETOPTS中的OPTIND

最近对shell中的OPTIND变量有些糊涂,想要查看文档弄清楚。可惜无论KSH还是BASH的手册中对这个变量都只是提了一下定义:OPTIND是一个索引,用于指向调用getopts函数时需要处理的参数,它的初始值为1。并没有展开论述,也没有范例。

如果只看这个定义的话,倒也很清楚。不过实际一测试,反而容易糊涂,尤其是碰到需要值(argument)的参数。请看下面一个简单的示例脚本:

在Linuxmint/ubuntu上:

#!/bin/bash
while getopts  "abc:" flag
do
  echo "$flag" $OPTIND $OPTARG
done

这里我们的脚本可以处理3个参数,a, b和c,其中c参数需要跟一个值。实际运行结果如下:

┌[acheng@azalea]-(~)
└> ./test.sh -a -b -c xd
a 2
b 3
c 5 xd

调用getopts之前,OPTIND的值为初始值1,getopts被调用后返回第一个参数a,同时OPTIND变为2,因此第二次调用getopts时返回第二个参数b,同时OPTIND变为3。同理,第三次调用getopts时返回第三个参数c,同时OPTIND变为5,因为值xd也同样算一个数的。第四次调用getopts时,由于不存在第五个参数,getopts返回-1,while循环结束。

看起来很清楚,没什么好糊涂的。

下面我们再看一下把参数合并后脚本运行的结果:

┌[acheng@azalea]-(~)
└> ./test.sh -abc xd
a 1
b 1
c 3 xd

这个时候由于abc混在一块,从形式看都是第一个参数,因此OPTIND一直为1也可以理解。但是不知道shell的内部是如何区分这几个参数的呢?

但在OpenBSD上(估计其他BSD也一样),结果就有点差别了(参数分开的情况下结果是相同的):

┌[acheng@vanilla]-(~)
└> ./test.sh -a -b -c xd
a 2
b 3
c 5 xd

但合并的时候就不同了:

┌[acheng@vanilla]-(~)
└> ./test.sh -abc xd
a 2
b 2
c 3 xd

不知为何。

Avatar

专业Linux/Unix/Windows系统管理员,开源技术爱好者。对操作系统底层技术,TCP/IP协议栈以及信息系统安全有强烈兴趣。电脑技术之外,则喜欢书法,古典诗词,数码摄影和背包行。

Sidebar