1. 程式人生 > >linux開發 -- 命令列引數解析 getopt

linux開發 -- 命令列引數解析 getopt

linux大部分工具都是以命令列方式執行,因此都需要對命令列引數解析,它們大多都是用相同的解析方法!(有點廢話)再次記錄下來!省得以後再查。

大部分軟體都是用getopt系列函式解析命令列,glibc中就提供了該函式的實現,即使沒有依賴glibc,其他軟體包也會提供相應的實現。

短格式的引數解析:
int getopt(int argc, char * const argv[], const char *optstring);
argc: main函式傳入的引數個數
argv: main函式傳入的引數指標
optstring: 一個用來描述接受的引數字串,每個字元代表一個選項,其中需要帶引數的加":"符號,例如"a:bc",表示接受a,b,c三個選項,其中a帶引數 呼叫如 cmd -a 123 -b -c
返回值: 返回解析到的選項的字元如'a',如果全部解析完畢返回-1. 解析到不在optstring中列出的返回'?'

全域性變數:
    char *optarg 選項附帶的引數的指標
    int optind  下一個被處理的argv下標
  1. int opt = 0;
  2. while ((opt = getopt(argc, argv, "a:bc")) != -1) {
  3. switch (opt) {
  4. case'a':
  5.         printf("paramenter is a = %s", optarg);
  6. break;
  7. case'b':
  8.         printf("paramenter is b");
  9. break;
  10. case'c':
  11.         printf("paramenter is c");
  12. case'?':
  13.         printf("unkown paramenter");
  14.     }
  15. }
解析裝格式選項:
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
支援 --arg=param --arg parm的格式,也支援短格式
longopts option的陣列
struct option {
   const char *name  選項的長名字
   int has_arg   指定是否帶引數 no_argument 不帶引數 required_argument 帶引數 optional_argument 可選引數
   int *flag  如果不為NULL,則當解析到該選項時將val設定為該值
   int val 解析到該選項時 函式返回val
}
}
longindex 如果不為NULL 被設定為解析到的長選項索引

int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
支援 -arg=param -arg param


指令碼中解析命令列選項
getopts

  1. while getopts a:bc opt; do
  2. case$opt
  3.     a) echo$OPTARG ;;
  4.     b) ;;
  5.     c) ;;
  6.     ?) ;;
  7.    esac
  8. done