POSIX与GNU的getopt规范

3150阅读 0评论2008-02-29 mystérieux
分类:C/C++


Unix/Linux系统函数库中的getopt是对命令行参数(argument)进行处理的程序。
首先,先明确 argument 与 parameter 这两个概念。这两个词在汉语里我们统统叫作“参数”,我注意到在外国人那里,这两个词也有混用的情况,但从主流上来看,它们之间还是有一定的区别,argument指命令行参数,而parameter指函数里的参数(包括实参或者形参),例如,main函数里的argc和argv就是两个parameter,这个argv就是argument的缩写,它是一个包含所有命令行参数的字符串数组(包括程序名字),argc是这些argv的数量。

POSIX规范:
以一个横杠开头的为选项。
如果不带参数的话,多个选项可以写在一个横杠后面。如-abc与-a -b -c的含义相同。
选项名是单字符的英文字母或者数字。
某些选项是带参数的。
选项和它的参数既可以分开写也可以在一起,grep选项中的 -A 10 与 -A10都是合乎规范的。
选项参数写在非选项参数之前。
如果一个参数只是两个横杠--,那么它会结束所有的选项,所有跟在它后面的参数都被视作非选项,即使它们前面有一个横杠。
一个单横杠-被解释为普通的非选项参数,通常它用来表示对标准输入和输出流的输入或者输出。
选项之间可以是任意顺序,也可多次出现,由程序负责对此进行解释。

GNU规范:
GNU C library对于getopt的实现也遵循了选项参数写在非选项参数之前这一原则,但用户在实际使用中,对选项和非选项可以灵活放置,是因为getopt在程序中把用户输入argv数组进行重新排序,使选项参数在前,非选项参数在后。这种作法是非标准的,可以设置_POSIX_OPTION_ORDER环境变量来禁止它。
GNU增加了长选项的规范,长选项由--开始,后面跟英文字母、数字或单横杠组成的字符串,选项名字的长度一般是一个到三个单词,由横杠隔开,有时候这些长选项有其对应的缩写型短选项。带参数的长选项的形式是--name=value。GNU系统在shell中为长选项提供了补全功能。

调用getopt函数的方式是:
#include
getopt函数中的整形变量optind,是程序把命令行参数重新排序之后为找出来的所有选项作的索引,通过argc 与 optind的比较,我们可以把非选项
找出来:
      while (optind < argc)                                                                                               
        printf ("%s ", argv[optind++]);
上一篇:[Bash脚本] 显示匹配与匹配所属的函数名
下一篇:文件的Access\Modify\Change时间