1.getopt()函數
getopt函數用來解析命令行選項,聲明所在頭文件爲:
#include <unistd.h>
函數原型如下:
int getopt(int argc, char * const argv[], const char *optstring);
第一個參數argc是參數個數,和main函數的argc一樣;
第二個參數argv是字符串指針,和main函數的argv一樣;
第三個參數 optstring 是選項字符串,是本文所要講述的重點。
2. optstring
選項字符串的內容如下:
- 字符代表一個選項;
- 沒有冒號就表示純選項,不需要參數;
- 一個冒號代表該選項之後必須帶有參數,可以使用空格,也可以不使用;
- 兩個冒號代表該項之後的參數可寫可不寫;
還有一些錯誤處理:
針對字符後無冒號的設定:
- 不加空格帶上參數後,會解析爲這個兩個獨立選項合併;
- 加上空格帶上參數,會只解析出選項,忽略參數。
針對字符後一個冒號的設定:
- 帶上空格多加幾個參數後,只解析第一個,其餘忽略;
- 如果不加參數,解析失敗;
比如,"vha:b:c::"
就表示:
- 支持-v選項,通常用於打印版本號;
- 支持-h選項,通常用於打印幫助信息;
- 支持-a選項,後面必須帶有一個參數;
- 支持-b選項,後面必須帶有一個參數;
- 支持-c選項,後面可以帶參數,也可以不用帶參數;
3. 使用的全局變量
使用該函數時,會用到/設置四個全局變量:
extern char* optarg;
extern int optind;
extern int opterr;
extern int optopt;
- optarg:用來保存選項的參數;
- optind:用來記錄下一個檢索位置;
- opterr:用來表示是否將錯誤信息輸出到stderr;
- optopt:表示不在選項字符串optstring中的選項;
4. 示例程序
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
int ch;
printf("初始值:optind = %d,opterr = %d\n", optind, opterr);
while ((ch = getopt(argc, argv, "vha:b:c::")) != -1)
{
printf("開始解析參數:optind = %d\n", optind);
switch (ch)
{
case 'v':
printf("捕獲到選項: -v\n");
printf("系統版本v1.1.0\n");
break;
case 'h':
printf("捕獲到選項: -h\n");
printf("用法示例: -a 1 -b 2 -c [\"hello\"]\n");
break;
case 'a':
printf("捕獲到選項: -a\n");
printf("該選項參數爲:%s\n\n", optarg);
break;
case 'b':
printf("捕獲到選項: -b\n");
printf("該選項參數爲:%s\n\n", optarg);
break;
case 'c':
printf("捕獲到選項: -c\n");
printf("該選項參數爲:%s\n\n", optarg);
break;
}
}
}
使用gcc編譯:
gcc getopt_test.c -o getopt_test.o
單獨測試每個選項:
測試都沒有問題,接下來再看看幾種錯誤的情況:
比如 -v 選項不需要參數,帶個參數的結果如下:
再比如-a選項明確需要帶一個參數,則帶兩個參數的結果如下:
如果不加參數,結果如下:
最後演示一個綜合示例: