getopt()原型:
int getopt( int argc, char *const argv[], const char *optstring );
參數(shù)argc、argv分別對(duì)應(yīng)main函數(shù)的參數(shù),表示參數(shù)個(gè)數(shù)和參數(shù)數(shù)組,optstring為選項(xiàng)字符串。getopt函數(shù)調(diào)用會(huì)返回第一個(gè)選項(xiàng),如果以相同的參數(shù)再次調(diào)用的話會(huì)返回下一個(gè)選項(xiàng),以此類推,當(dāng)參數(shù)列已經(jīng)到結(jié)尾時(shí)getopt()函數(shù)返回-1,當(dāng)遇到一個(gè)未知的選項(xiàng)時(shí) getopt 返回'?',并且每次都會(huì)重新設(shè)置相應(yīng)的全局變量。
getopt()設(shè)置的全局變量包括:
1.optarg(char*) -- 指向當(dāng)前選項(xiàng)參數(shù)的指針;
2.optind(int) -- 再次調(diào)用getopt()時(shí)的下一個(gè)argv指針的索引;
3.optopt(int) -- 最后一次調(diào)用getopt()返回的已知選項(xiàng);
4.opterr(int) -- 變量opterr被初始化為1。如果不希望getopt()輸出出錯(cuò)信息,將全域變量opterr設(shè)為0即可;
用一個(gè)自己應(yīng)用到的例子來簡(jiǎn)單解析該函數(shù):
1 #include <stdio.h>
2 #include <unistd.h>
3
4 int main(int argc, char** argv )
5 {
6 int ch,destConsole = 0;
7 int def = 0;
8 char* buf[4];
9
10 opterr = 0;
11 while ((ch = getopt(argc, argv, "Of:h:p:"))!= -1) {
12 switch(ch) {
13 case 'O':
14 buf[0] = optarg;
15 break;
16 case 'f':
17 buf[1] = optarg;
18 break;
19 case 'h':
20 buf[2] = optarg;
21 break;
22 case 'p':
23 buf[3] = optarg;
24 break;
25 default:
26 def = 1;
27 }
28 }
29
30 printf("buf[0]: %s\n", buf[0]);
31 printf("buf[1]: %s\n", buf[1]);
32 printf("buf[2]: %s\n", buf[2]);
33 printf("buf[3]: %d\n", atoi(buf[3]));
34
35 return 0;
36 }
這是一個(gè)記錄日志的程序部分代碼(沒做出錯(cuò)處理),同時(shí)支持終端輸出、寫文件、遠(yuǎn)程傳輸?shù)裙δ埽ㄟ€有一些寫數(shù)據(jù)庫(kù)等,不一一列舉)。
選項(xiàng)字符串為:“Of:h:p:”:
O表示是無參數(shù)選項(xiàng),終端輸出判斷部分在14行,可以加一行給終端輸出設(shè)置標(biāo)記,比如destConsole=1,無參數(shù)自然對(duì)應(yīng)30行就應(yīng)該打印空;
f、h、p都為有參數(shù)選項(xiàng),如果都有設(shè)置有效,那么對(duì)應(yīng)的就會(huì)在31-33行分別打印文件名、主機(jī)名、端口號(hào)。
運(yùn)行結(jié)果:
[root@develop-x /]# ./testOpt -O -f test.txt -h 192.168.0.111 -p 6666
buf[0]:
buf[1]: test.txt
buf[2]: 192.168.0.111
buf[3]: 6666
復(fù)雜命令行處理getopt_long()可以參考man和getopt(),主要是增強(qiáng)了長(zhǎng)選項(xiàng)的功能。