转载请注明出处:http://blog.csdn.net/zhangyang0402/archive/2010/06/14/5671410.aspx

 

 

命令行工具下的参数选项有两种,长选项短选项。短选项以-开头,后面跟单个字母;长选项以--开头,后面可跟多个字母。

 

功能:解析命令行短选项参数

函数原型:

#include <getopt.h>

int getopt(int argc, char * const argv[], const char *optstring);

几个外部变量

extern char *optarg;  

extern int optind, opterr, optopt;

optarg:若短选项后有参数,则optarg指向该参数

optind:扫描选项时,标识下一个选项的索引;扫描结束后,标识第一个非选项参数索引

opterr:出现不可识别的选项时,getopt将打印错误信息。将opterr设为0,可不打印错误信息。

optopt:存放不可识别的选项至optopt

 

1. 参数

argc:参数的个数(main)

argv:参数数组(main)

optstring:短选项字符集合,如 -i -n中的i,n

 

若选项后面有参数,则选项字符后加: 对应的参数值保存在外部变量optarg

optstring "i:a",则表示程序支持两个短选项 -i arg-a, -i后面须有参数值

当执行./a.out -i filename -a时,optarg指针就指向filename

 

2. 解析过程

getopt首先扫描argv[1]argv[argc-1],并将选项及参数依次放到argv数组的最左边,非选项参数依次放到argv的最后边

如执行程序为:

     0     1   2  3  4  5  6   7  8  9 

$ ./mygetopt file1 -i infile -a -o outfile -v -h file2

 

扫描过程中,optind是下一个选项的索引, 非选项参数将跳过,同时optind1optind初始值为1。当扫描argv[1]时,为非选项参数,跳过,optind=2;扫描到-i选项时,后面有参数,下一个将要扫描的选项是-a,optind更改为4;扫描到-a选项时,下一个选项是-ooptind=5;扫描到-o选项时,后面有参数,下一个选项是-v,optind=7;扫描到-v选项时,下一个选项是-hoptind=8;扫描到-h选项时,optind=9

 

扫描结束后,getopt会将argv数组修改成下面的形式

     0    1  2  3  4  5   6  7  8   9

$./mygetopt -i infile -a -o outfile -v -h file1 file2

 

同时,optind会指向非选项的第一个参数,如上面,optind将指向file1

 

 

3. 返回值

getopt找到短选项字符,则返回该选项字符;

若出现不能接受的选项字符或丢失选项参数,则返回?,同时optopt将被设置成相应选项字符;

则后面没有选项字符,则返回-1

 

4. 测试

 mygetopt.c

执行结果:

$ ./mygetopt file1 -i infile -a -o outfile -v -h file2

option i: infile

optind=4

 

option a :a

optind=5

 

option o: outfile

optind=7

 

option v: v

optind=8

 

Usage: ./mygetopt [-i infile] [-a] [-o outfile] [-v] [-h] [file]

optind=9

 

non-option arguments below:

file1

file2    

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐