Linux-getopt

少年如風發表於2019-04-23

Linux下命令列解析函式getopt.

原型:
int getopt(int argc,char *argv[],const char *optstring);
引數:
agrc:命令列引數個數
argv[]:命令列引數陣列
optstring:命令列引數選項
  
getopt呼叫一次將返回第一個選項,再次呼叫將返回下一個選項並設定相應的全域性變數,不再識別返回-1:
optarg--指向當前選項引數的指標
optind--成功呼叫一次指向下一個argv指標的索引
optopt--最後一個未知選項,預設為0,出錯為出錯時的選項
opterr--全域性變數預設為1,控制錯誤資訊的輸出,改為0則不輸出

optstring注意:a:b:c::e
 a b c d e表示命令列的 -a -b -c -d -e選項; :和::表示選項後有引數,e後邊並沒有引數。
 :引數在選項後有一個空格或者挨著; ::可省略引數或者引數緊挨著選項 。

#include<stdio.h>
#include<unistd.h>
#include<string.h>

//int opterr=0;//控制錯誤資訊0表示關閉
int main(int argc,char *argv[]){
	int ch;
	printf("命令列引數個數:argc=%d\n",argc);
	
	for(int i=0;i<argc;i++){
		printf("命令列引數:argv[%d]=%s\n",i,argv[i]);
	}
	
	ch=getopt(argc,argv,"a:b::c:d");
	while(ch!=-1){
		switch(ch){
			case 'a':printf("選擇a選項:ch=%c,optind=%d,optarg=%s,opterr=%d,optopt=%d\n",ch,optind,optarg,opterr,optopt);break;
			case 'b':printf("選擇b選項:ch=%c,optind=%d,optarg=%s,opterr=%d,optopt=%d\n",ch,optind,optarg,opterr,optopt);break;
			case 'c':printf("選擇c選項:ch=%c,optind=%d,optarg=%s,opterr=%d,optopt=%d\n",ch,optind,optarg,opterr,optopt);break;
			case 'd':printf("選擇d選項:ch=%c,optind=%d,optarg=%s,opterr=%d,optopt=%d\n",ch,optind,optarg,opterr,optopt);break;
			case '?':printf("非法選項或者缺少引數:ch=%c,optind=%d,optarg=%s,opterr=%d,optopt=%d\n",ch,optind,optarg,opterr,optopt);break;
			default:printf("非法選項或者缺少引數返回?,等同於上邊的?選項");break;
		}
		ch=getopt(argc,argv,"a:b::c:d");
	}
	return 0;
}

 

關閉錯誤資訊設定:int opterr=0