linux開發 -- 命令列引數解析 getopt
阿新 • • 發佈:2019-02-04
linux大部分工具都是以命令列方式執行,因此都需要對命令列引數解析,它們大多都是用相同的解析方法!(有點廢話)再次記錄下來!省得以後再查。
大部分軟體都是用getopt系列函式解析命令列,glibc中就提供了該函式的實現,即使沒有依賴glibc,其他軟體包也會提供相應的實現。
短格式的引數解析:
int getopt(int argc, char * const argv[], const char *optstring);
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
支援 -arg=param -arg param
指令碼中解析命令列選項
getopts
大部分軟體都是用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下標
- int opt = 0;
- while ((opt = getopt(argc, argv, "a:bc")) != -1) {
- switch (opt) {
- case'a':
- printf("paramenter is a = %s", optarg);
- break;
- case'b':
- printf("paramenter is b");
- break;
- case'c':
- printf("paramenter is c");
- case'?':
- printf("unkown paramenter");
- }
- }
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
- while getopts a:bc opt; do
- case$opt
- a) echo$OPTARG ;;
- b) ;;
- c) ;;
- ?) ;;
- esac
- done