假设有一程序 testopt,其命令行选项参数有:
  -i            选项
  -l            选项
  -r           选项
  -n <值> 带关联值的选项
则处理参数的代码如下:
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    // 选项参数 
    int opt;
    while ((opt = getopt(argc, argv, ":in:lr")) != -1) {
        switch (opt) {
        case 'i':    // 开关选项
        case 'l':
        case 'r':
            printf("option: %c\n", opt);
            break;
        case 'n':    // 提供供了所需关联值的选项 
            printf("value of option %c: %s\n", opt, optarg);
            break;
        case ':':    // 缺乏所需关联值的选项,选项字符在全局变量 optopt 中
            printf("option needs a value: %c\n", optopt);
            break;
        case '?':    // 未知选项
            printf("unknown option: %c\n", optopt);
            break;
        }
    }
    // 其余参数(非选项),由全局变量 optind 指出开始位置
    while(optind<argc) {
        printf("argument: %s\n", argv[optind]);
        ++optind;
    }
    return 0;
}
输入命令行:
$ ./testopt abc.txt -il -r -p -n18 myfile.c xyz
 
输出:
option: i
option: l
option: r
unknown option: p
value of option n: 18
argument: abc.txt
argument: myfile.c
argument: xyz
 
可以看到,getopt()已经把命令行参数重新排序,非选项参数都挪到了后面。