对于程序员来说,在linux上用的最多的就是通过命令行来运行程序,但是很多人都不是很清楚命令行的书写格式规范,所以当输入错误的时候,shell就会提示输入错误之类的信息。
我们可以自己编写命令行参数解析程序,但是其实linux已经提供了一个函数来实现相关的功能,这个函数就是getopt函数。
相关函数头文件
#include<unistd.h>
函数原型及相关外部变量声明
int getopt(int argc, char* const argv[ ], const char* optstring);
extern char *optarg; // 如果一个选项后面接有一个参数值, 则 optarg 就会指向该参数值
extern int optind, // 初始化值为1,被设置为下一个待处理参数的索引。用来记录 getopt 的进度。
extern int opterr, // 初始化值为1,当opterr=0时,getopt不向stderr输出错误信息。
extern int optopt; // 当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,
// 该选项将存储在optopt中, getopt 返回‘?’
函数说明
getopt() 用来分析命令行参数,也就是主要用来分析命令行参数中的选项的。参数 argc 和 argv 是由 main() 传递的参数个数和内容。参数 optstring 表示选项指定符字符串。该字符串告诉 getopt 哪些选项可用,以及它们是否有关联值。每调用一次 getopt() 函数,返回一个选项,如果该选项有参数(关联值),则 optarg 指向该参数(关联值)。
函数 getopt() 认为 optstring 中,以 ‘-’ 开头的字符(注意!不是字符串!!)就是命令行参数选项,有的参数选项后面可以跟参数值。optstring 中的格式规范如下:
1) 单个字符,表示选项,
2) 单个字符后接一个冒号“ :”,表示该选项后必须跟一个参数值(关联值)。参数紧跟在选项后或者以空格隔 开。该参数的指针赋给optarg。
3) 单个字符后跟两个冒号 ” :: ”,表示可选值选项,该选项后如果跟一个参数。参数必须紧跟在选项后不能以空 格隔开。该参数的指针赋给 optarg。
在这里拿 "1ac:d::" 作为样例进行说明,其中的1, a 就是不带值的参数选项,c 是必须带值的参数选项,d是可选值的参数。
在实际调用中,‘-1 -a -c cvalue -d‘, ‘-1 -a -c cvalue -ddvalue‘, ‘-1a -ddvalue -c cvalue‘都是合法的。这里需要注意三点:
1. 不带值的参数可以连写,象1和a是不带值的参数,它们可以-1 -a分开写,也可以-1a或-a1连写。
2. 参数不分先后顺序,‘-1a -c cvalue -ddvalue‘和‘-d -c cvalue -a1‘的解析结果是一样的。
3. 要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的 格式就会解析错误。
返回值
getopt() 每次调用会逐次返回命令行传入的参数。
当没有参数的最后的一次调用时,getopt() 将返回 -1。
当解析到一个不在 optstring 里面的参数,或者一个必选值参数不带值时,返回 ‘ ? ‘。
当 optstring 是以 ‘ : ‘ 开头时,缺值参数的情况下会返回 ‘ : ‘,而不是 ‘ ? ‘ 。
程序范例