日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)

發布時間:2025/3/20 linux 25 豆豆

參考文章:淺談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)一個字符,后接兩個冒號——表示選項后面帶一個可選參數,即參數可有可無, 如果帶參數,則選項與參數之間不能有空格形式應該如-b200

3、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)如果遇到一個選項沒有在短字符、長字符里面。或者在長字符里面存在二義性的,返回“?”(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变量)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线播放视频高清在线观看 | 日本色片网站 | 激情五月婷婷在线 | 91caob | 女十八毛片 | 少妇特黄a一区二区三区88av | 日本成人精品视频 | 黄在线观看免费 | 青春草网站| 破处视频在线观看 | 午夜一本 | 国产91精选 | 亚洲色图导航 | 亚洲日本影院 | 午夜在线视频免费 | 欧美色精品在线 | 国产一级久久久 | 国产日韩欧美在线观看视频 | 久久免费看视频 | 日本xxxx人| 按摩害羞主妇中文字幕 | 91网站免费入口 | 国产视频一区二区三 | 99久久久国产精品无码网爆 | 妺妺窝人体色www聚色窝仙踪 | 国精品无码人妻一区二区三区 | 51久久久| 国产粉嫩av | 俄罗斯黄色录像 | 国产人成精品 | 久久爱伊人 | 一路向西在线看 | 亚洲大片 | free性欧美hd另类 | 日本免费毛片 | 日韩福利社 | 日本熟妇人妻xxxxx | 老女人做爰全过程免费的视频 | 毛片基地在线观看 | 黄色香蕉网站 | 麻豆最新网址 | 成人黄色小视频 | 老熟女一区二区三区 | 日韩一级黄色 | 无码人妻精品一区二区三区不卡 | 午夜福利电影一区二区 | 欧美日韩国产综合网 | 丰满人妻一区二区三区无码av | 在线观看一二三区 | 亚洲精品乱码久久久久久自慰 | 综合激情五月婷婷 | 亚洲无限码 | 91在线视频导航 | 一本加勒比hezyo黑人 | 91插插插插插 | 91av日本| 男操女视频网站 | www.久久精品.com | 性色tv | 夜夜精品一区二区无码 | 久草久草| 伊人色在线 | 久久久精品999 | 国产黄色大片 | 午夜视频www | 奴性女会所调教 | 亚洲黄片一区二区 | 夜间福利在线 | 国产精品情侣呻吟对白视频 | 色香欲综合网 | 美国黄色一级毛片 | 久久精品免费在线观看 | 激情五月婷婷在线 | 成人黄色在线视频 | 男人透女人免费视频 | 少妇精品久久久一区二区三区 | 中文字幕 人妻熟女 | 久久久久久久伊人 | 一区二区在线观看免费视频 | 国产又粗又大又硬 | 国产中文字幕免费 | 欧美中字| 成人一区二区三区在线观看 | av一二区 | 女女调教被c哭捆绑喷水百合 | 日韩资源网 | 91麻豆产精品久久久久久 | 视频在线观看一区 | 成人欧美在线 | 在线观看日韩一区二区 | 极品色影视 | 美色视频 | 日韩在线不卡 | 91视频污在线观看 | 亚洲毛茸茸 | 久久观看最新视频 | 欧美aa一级| 精品国产乱码久久久久久1区二区 | 久久伊人婷婷 |