C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)
參考文章:淺談linux的命令行解析參數之getopt_long函數
文章目錄
- 前言
- 一、關于命令行參數
- 二、getopt_long函數
- 參數以及返回值介紹(以上三個函數都適用):
- 1、argc和argv和main函數的兩個參數一致。
- 2、optstring: 表示短選項字符串。
- 3、longopts:表示長選項結構體。結構如下:
- 4、longindex:longindex非空,它指向的變量將記錄當前找到參數符合longopts里的第幾個元素的描述,即是longopts的下標值。
- 5、全局變量:
- 6、返回值:
- 三、測試(自行測試)(getopts配合case來進行操作時有兩個隱含變量:一個是OPTARG,用來取當前選項的值,另外一個是OPTIND,代表下一個要處理的元素位置。)
- 20211230 optind變量
前言
在linux中,經常需要各種命令,通常情況下都會帶各種參數,而這些參數是如何解析的呢?通常使用GNU C提供的函數getopt、getopt_long、getopt_long_only函數來解析命令行參數。
一、關于命令行參數
命令行參數可以分為兩類,一類是短選項,一類是長選項,短選項在參數前加一杠"-",長選項在參數前連續加兩杠"–",如下表(ls 命令參數)所示,其中-a,-A,-b都表示短選項,–all,–almost-all, --author都表示長選項。他們兩者后面都可選擇性添加額外參數。比如–block-size=SIZE,SIZE便是額外的參數。例如:
LS(1) User Commands LS(1)NAMEls - list directory contentsSYNOPSISls [OPTION]... [FILE]...DESCRIPTIONList information about the FILEs (the current directory by default).Sort entries alphabetically if none of -cftuvSUX nor --sort is speci‐fied.Mandatory arguments to long options are mandatory for short optionstoo.-a, --alldo not ignore entries starting with .-A, --almost-alldo not list implied . and ..--authorwith -l, print the author of each file-b, --escapeprint C-style escapes for nongraphic characters--block-size=SIZEscale sizes by SIZE before printing them; e.g., '--block-size=M'prints sizes in units of 1,048,576 bytes; see SIZE format below-B, --ignore-backupsdo not list implied entries ending with ~二、getopt_long函數
getopt函數只能處理短選項,而getopt_long函數兩者都可以,可以說getopt_long已經包含了getopt的功能。因此,這里就只介紹getopt_long函數。而getopt_long與getopt_long_only的區別很小,等介紹完getopt_long,再提起會更好。
#include <unistd.h> extern char *optarg; extern int optind, opterr, optopt; #include <getopt.h> 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_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);參數以及返回值介紹(以上三個函數都適用):
1、argc和argv和main函數的兩個參數一致。
2、optstring: 表示短選項字符串。
形式如“a:b::cd:“,分別表示程序支持的命令行短選項有-a、-b、-c、-d,冒號含義如下: (1)只有一個字符,不帶冒號——只表示選項, 如-c (2)一個字符,后接一個冒號——表示選項后面帶一個參數,如-a 100 (3)一個字符,后接兩個冒號——表示選項后面帶一個可選參數,即參數可有可無, 如果帶參數,則選項與參數之間不能有空格形式應該如-b2003、longopts:表示長選項結構體。結構如下:
struct option { const char *name; int has_arg; int *flag; int val; }; eg:static struct option longOpts[] = {{ "daemon", no_argument, NULL, 'D' },{ "dir", required_argument, NULL, 'd' },{ "out", required_argument, NULL, 'o' },{ "log", required_argument, NULL, 'l' },{ "split", required_argument, NULL, 's' },{ "http-proxy", required_argument, &lopt, 1 },{ "http-user", required_argument, &lopt, 2 },{ "http-passwd", required_argument, &lopt, 3 },{ "http-proxy-user", required_argument, &lopt, 4 },{ "http-proxy-passwd", required_argument, &lopt, 5 },{ "http-auth-scheme", required_argument, &lopt, 6 },{ "version", no_argument, NULL, 'v' },{ "help", no_argument, NULL, 'h' },{ 0, 0, 0, 0 }};(1)name:表示選項的名稱,比如daemon,dir,out等。
(2)has_arg:表示選項后面是否攜帶參數。該參數有三個不同值,如下:
a: no_argument(或者是0)時 ——參數后面不跟參數值,eg: --version,--help b: required_argument(或者是1)時 ——參數輸入格式為:--參數 值 或者 --參數=值。eg:--dir=/home c: optional_argument(或者是2)時 ——參數輸入格式只能為:--參數=值(3)flag:這個參數有兩個意思,空或者非空。
a:如果參數為空NULL,那么當選中某個長選項的時候,getopt_long將返回val值。eg,可執行程序 --help,getopt_long的返回值為h. b:如果參數不為空,那么當選中某個長選項的時候,getopt_long將返回0,并且將flag指針參數指向val值。eg: 可執行程序 --http-proxy=127.0.0.1:80 那么getopt_long返回值為0,并且lopt值為1。(4)val:表示指定函數找到該選項時的返回值,或者當flag非空時指定flag指向的數據的值val。
4、longindex:longindex非空,它指向的變量將記錄當前找到參數符合longopts里的第幾個元素的描述,即是longopts的下標值。
5、全局變量:
(1)optarg:表示當前選項對應的參數值。(2)optind:表示的是下一個將被處理到的參數在argv中的下標值。(3)opterr:如果opterr = 0,在getopt、getopt_long、getopt_long_only遇到錯誤將不會輸出錯誤信息到標準輸出流。opterr在非0時,向屏幕輸出錯誤。(4)optopt:表示沒有被未標識的選項。6、返回值:
(1)如果短選項找到,那么將返回短選項對應的字符。(2)如果長選項找到,如果flag為NULL,返回val。如果flag不為空,返回0(3)如果遇到一個選項沒有在短字符、長字符里面?;蛘咴陂L字符里面存在二義性的,返回“?”(4)如果解析完所有字符沒有找到(一般是輸入命令參數格式錯誤,eg: 連斜杠都沒有加的選項),返回“-1”(5)如果選項需要參數,忘了添加參數。返回值取決于optstring,如果其第一個字符是“:”,則返回“:”,否則返回“?”。注意:
(1)longopts的最后一個元素必須是全0填充,否則會報段錯誤(2)短選項中每個選項都是唯一的。而長選項如果簡寫,也需要保持唯一性。三、測試(自行測試)(getopts配合case來進行操作時有兩個隱含變量:一個是OPTARG,用來取當前選項的值,另外一個是OPTIND,代表下一個要處理的元素位置。)
1、官網給出測試用例。
#include <stdio.h> /* for printf */ #include <stdlib.h> /* for exit */ #include <getopt.h>int main(int argc, char **argv) {int c;int digit_optind = 0;while (1) {int this_option_optind = optind ? optind : 1;int option_index = 0;static struct option long_options[] = {{"add", required_argument, 0, 0 },{"append", no_argument, 0, 0 },{"delete", required_argument, 0, 0 },{"verbose", no_argument, 0, 0 },{"create", required_argument, 0, 'c'},{"file", required_argument, 0, 0 },{0, 0, 0, 0 }};c = getopt_long(argc, argv, "abc:d:012",long_options, &option_index);if (c == -1)break;switch (c) {case 0:printf("option %s", long_options[option_index].name);if (optarg)printf(" with arg %s", optarg);printf("\n");break;case '0':case '1':case '2':if (digit_optind != 0 && digit_optind != this_option_optind)printf("digits occur in two different argv-elements.\n");digit_optind = this_option_optind;printf("option %c\n", c);break;case 'a':printf("option a\n");break;case 'b':printf("option b\n");break;case 'c':printf("option c with value '%s'\n", optarg);break;case 'd':printf("option d with value '%s'\n", optarg);break;case '?':break;default:printf("?? getopt returned character code 0%o ??\n", c);}}if (optind < argc) {printf("non-option ARGV-elements: ");while (optind < argc)printf("%s ", argv[optind++]);printf("\n");}exit(EXIT_SUCCESS); }運行結果:
[root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]23# ./a.out -0 option 0 [root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]24# ./a.out -1 option 1 [root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]25# ./a.out -2 option 2 [root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]26# ./a.out -a option a [root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]27# ./a.out -b option b [root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]28# [root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]28# ./a.out -c100 option c with value '100' [root@ubuntu /home/yg/arnold_test/20211129_TEST_getopt]29# ./a.out -d333 option d with value '333'還是有點懵逼,先用著吧!!
20211230 optind變量
今天看\external\rkmedia\examples\rkmedia_venc_mjpeg_test.c源碼,有個optind變量,不知道在哪定義的,點又點不進去
解釋:
1.這個變量是在什么地方定義的?
答:系統定義的
2.這個變量在什么場景下使用?
答:在解析命令行參數時會用到
3.這個變量存在的意義?
在每調用一次getopt()或getopt_long()類似函數時此值會遞增1
參考文章:optind變量
總結
以上是生活随笔為你收集整理的C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在VS一个工程里面测试不同代码?(创
- 下一篇: CV报错:CAP_IMAGES: can