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
不知为何。