程序例子来自 《Linux 程序设计》
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
// 全局变量
extern char* optarg; // 选项参数
extern int optind; // 选项下标
extern int opterr; // 解析报错
extern int optopt; // 选项值
int opt = 0;
while (1)
{
// ilr后面没:,意味着它不需要跟参数
// 选项f紧接着:,意味着它后面必须跟参数
opt = getopt(argc, argv, ":if:lr");
if (-1 == opt)
{
break;
}
switch (opt)
{
case 'i':
case 'l':
case 'r':
printf("option: %c\n", opt);
break;
case 'f':
printf("filename: %s\n", optarg);
break;
case ':':
printf("option need a value\n");
break;
case '?':
printf("Unknow option type: %c\n", optopt); // 无法识别的选项
break;
}
}
// 非选项参数
for (; optind < argc; ++optind)
{
printf("argument: %s\n", argv[optind]);
}
return 0;
}
wtz@ubuntu:~/Desktop$ ./a -i
option: i
wtz@ubuntu:~/Desktop$ ./a -ilr
option: i
option: l
option: r
wtz@ubuntu:~/Desktop$ ./a -f
option need a value
wtz@ubuntu:~/Desktop$ ./a -f a.txt
filename: a.txt
wtz@ubuntu:~/Desktop$ ./a -ilrf a.txt kj jj
option: i
option: l
option: r
filename: a.txt
argument: kj
argument: jj
wtz@ubuntu:~/Desktop$ ./a -ihl
option: i
Unknow option type: h
option: l
#include <unistd.h>
#include <stdio.h>
#include <getopt.h>
int main(int argc, char* argv[])
{
extern char* optarg;
extern int optopt;
extern int optind;
extern int opterr;
int opt;
struct option longopts[] = {
{"init", 0, NULL, 'i'},
{"file", 1, NULL, 'f'},
{"list", 0, NULL, 'l'},
{"restart", 0, NULL, 'r'},
{0, 0, 0, 0}};
while (1)
{
opt = getopt_long(argc, argv, ":if:lr", longopts, NULL);
if (-1 == opt)
{
break;
}
switch (opt)
{
case 'i':
case 'l':
case 'r':
printf("option: %c\n", opt);
break;
case 'f':
printf("filename: %s\n", optarg);
break;
case ':':
printf("option needs a value\n");
break;
case '?':
printf("unknown option: %c\n", optopt);
break;
}
}
for (; optind < argc; optind++)
{
printf("argument: %s\n", argv[optind]);
}
return 0;
}
wtz@ubuntu:~/Desktop$ ./b --init
option: i
wtz@ubuntu:~/Desktop$ ./b -i
option: i
wtz@ubuntu:~/Desktop$ ./b -ilr
option: i
option: l
option: r
wtz@ubuntu:~/Desktop$ ./b -f
option needs a value
wtz@ubuntu:~/Desktop$ ./b -f a.txt
filename: a.txt
wtz@ubuntu:~/Desktop$ ./b --file a.xt
filename: a.xt
wtz@ubuntu:~/Desktop$ ./b -h
unknown option: h
wtz@ubuntu:~/Desktop$ ./b --a
unknown option: