linux解析命令行選項(xiàng)getopt_long用法解讀
發(fā)布時間:2012-06-28 16:50:07 作者:lanyan822
我要評論

linux解析命令行選項(xiàng)getopt_long用法
linux解析命令行選項(xiàng)getopt_long用法
在程序中難免需要使用命令行選項(xiàng),可以選擇自己解析命令行選項(xiàng),但是有現(xiàn)成的,何必再造輪子。
下面介紹使用getopt_long解析命令行選項(xiàng)。
程序中主要使用:
短選項(xiàng) 長選項(xiàng) 是否需要參數(shù) 備注
-v --version 否 查詢版本號
-n --name 是(用戶名) 指定使用者
-d --debug 否 是否已測試
1、函數(shù)出處
[cpp]
#include <getopt.h> //getopt_long()頭文件位置
int getopt_long (int ___argc, char *const *___argv,
const char *__shortopts,
const struct option *__longopts, int *__longind);
int getopt_long_only (int ___argc, char *const *___argv,
const char *__shortopts,
const struct option *__longopts, int *__longind);
2、參數(shù)介紹
argc argv :直接從main函數(shù)傳遞而來
shortopts:短選項(xiàng)字符串。如”n:v",這里需要指出的是,短選項(xiàng)字符串不需要‘-’,而且但選項(xiàng)需要傳遞參數(shù)時,在短選項(xiàng)后面加上“:”。
longopts:struct option 數(shù)組,用于存放長選項(xiàng)參數(shù)。
longind:用于返回長選項(xiàng)在longopts結(jié)構(gòu)體數(shù)組中的索引值,用于調(diào)試。一般置為NULL
下面介紹struct option
[cpp]
struct option
{
const char *name;//長選項(xiàng)名
int has_arg;//是否需要參數(shù)
int *flag;
int val;
};
name:長選項(xiàng)名字
has_arg:是否需要參數(shù)。值有三種情況
[cpp]
# define no_argument 0 //不需要參數(shù)
# define required_argument 1 //必須指定參數(shù)
# define optional_argument 2 //參數(shù)可選
flag 和val
flag和val相互依賴,主要分兩種情況:
(1)、flag為NULL,val值用于確定該長選項(xiàng),所以需要為長選項(xiàng)指定唯一的val值。這里也為長選項(xiàng)和短選項(xiàng)建立了橋梁。
(2)、flag不為NULL,則將val值存放到flag所指向的存儲空間,用于標(biāo)識該長選項(xiàng)出現(xiàn)過。
3、返回值
程序中使用短選項(xiàng),則返回短選項(xiàng)字符(如‘n'),當(dāng)需要參數(shù)是,則在返回之前將參數(shù)存入到optarg中。
程序中使用長選項(xiàng),返回值根據(jù)flag和val確定。當(dāng)flag為NULL,則返回val值。所以根據(jù)val值做不同的處理,這也說明了val必須唯一。當(dāng)val值等于短選項(xiàng)值,則可以使用短選項(xiàng)解析函數(shù)解析長選項(xiàng);當(dāng)flag不為NULL,則將val值存入flag所指向的存儲空間,getopt_long返回0
出現(xiàn)未定義的長選項(xiàng)或者短選項(xiàng),getopt_long返回?
解析完畢,getopt_long返回-1
4、實(shí)例
理論要與實(shí)際相結(jié)合
[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h> //getopt_long()頭文件位置
int main(int argc, char** argv)
{
const char *optstring="n:v";
int c,deb,index;
struct option opts[]={{"username",required_argument,NULL,'n'},
{"version",no_argument,NULL,'v'},
{"debug",no_argument,&deb,1},
{0,0,0,0}};
while((c=getopt_long(argc,argv,optstring,opts,&index))!=-1)
{
switch(c)
{
case 'n'://-n 或者 --username 指定用戶名
printf("username is %s\n",optarg);
break;
case 'v'://-v 或者--version,輸出版本號
printf("version is 0.0.1 \n");
break;
case 0://flag不為NULL
printf("debug is %d\n",deb);
break;
case '?'://選項(xiàng)未定義
printf("?\n");
break;
default:
printf("c is %d\n",c);
break;
}
}
return 0;
}
運(yùn)行截圖:

說明一下:getopt_long_only,這個函數(shù)功能與getopt_long相同,只是可以使用’-‘后面跟長選項(xiàng)名,如./main -username jackie
在程序中難免需要使用命令行選項(xiàng),可以選擇自己解析命令行選項(xiàng),但是有現(xiàn)成的,何必再造輪子。
下面介紹使用getopt_long解析命令行選項(xiàng)。
程序中主要使用:
短選項(xiàng) 長選項(xiàng) 是否需要參數(shù) 備注
-v --version 否 查詢版本號
-n --name 是(用戶名) 指定使用者
-d --debug 否 是否已測試
1、函數(shù)出處
復(fù)制代碼
代碼如下:[cpp]
#include <getopt.h> //getopt_long()頭文件位置
int getopt_long (int ___argc, char *const *___argv,
const char *__shortopts,
const struct option *__longopts, int *__longind);
int getopt_long_only (int ___argc, char *const *___argv,
const char *__shortopts,
const struct option *__longopts, int *__longind);
2、參數(shù)介紹
argc argv :直接從main函數(shù)傳遞而來
shortopts:短選項(xiàng)字符串。如”n:v",這里需要指出的是,短選項(xiàng)字符串不需要‘-’,而且但選項(xiàng)需要傳遞參數(shù)時,在短選項(xiàng)后面加上“:”。
longopts:struct option 數(shù)組,用于存放長選項(xiàng)參數(shù)。
longind:用于返回長選項(xiàng)在longopts結(jié)構(gòu)體數(shù)組中的索引值,用于調(diào)試。一般置為NULL
下面介紹struct option
復(fù)制代碼
代碼如下:[cpp]
struct option
{
const char *name;//長選項(xiàng)名
int has_arg;//是否需要參數(shù)
int *flag;
int val;
};
name:長選項(xiàng)名字
has_arg:是否需要參數(shù)。值有三種情況
復(fù)制代碼
代碼如下:[cpp]
# define no_argument 0 //不需要參數(shù)
# define required_argument 1 //必須指定參數(shù)
# define optional_argument 2 //參數(shù)可選
flag 和val
flag和val相互依賴,主要分兩種情況:
(1)、flag為NULL,val值用于確定該長選項(xiàng),所以需要為長選項(xiàng)指定唯一的val值。這里也為長選項(xiàng)和短選項(xiàng)建立了橋梁。
(2)、flag不為NULL,則將val值存放到flag所指向的存儲空間,用于標(biāo)識該長選項(xiàng)出現(xiàn)過。
3、返回值
程序中使用短選項(xiàng),則返回短選項(xiàng)字符(如‘n'),當(dāng)需要參數(shù)是,則在返回之前將參數(shù)存入到optarg中。
程序中使用長選項(xiàng),返回值根據(jù)flag和val確定。當(dāng)flag為NULL,則返回val值。所以根據(jù)val值做不同的處理,這也說明了val必須唯一。當(dāng)val值等于短選項(xiàng)值,則可以使用短選項(xiàng)解析函數(shù)解析長選項(xiàng);當(dāng)flag不為NULL,則將val值存入flag所指向的存儲空間,getopt_long返回0
出現(xiàn)未定義的長選項(xiàng)或者短選項(xiàng),getopt_long返回?
解析完畢,getopt_long返回-1
4、實(shí)例
理論要與實(shí)際相結(jié)合
復(fù)制代碼
代碼如下:[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h> //getopt_long()頭文件位置
int main(int argc, char** argv)
{
const char *optstring="n:v";
int c,deb,index;
struct option opts[]={{"username",required_argument,NULL,'n'},
{"version",no_argument,NULL,'v'},
{"debug",no_argument,&deb,1},
{0,0,0,0}};
while((c=getopt_long(argc,argv,optstring,opts,&index))!=-1)
{
switch(c)
{
case 'n'://-n 或者 --username 指定用戶名
printf("username is %s\n",optarg);
break;
case 'v'://-v 或者--version,輸出版本號
printf("version is 0.0.1 \n");
break;
case 0://flag不為NULL
printf("debug is %d\n",deb);
break;
case '?'://選項(xiàng)未定義
printf("?\n");
break;
default:
printf("c is %d\n",c);
break;
}
}
return 0;
}
運(yùn)行截圖:

說明一下:getopt_long_only,這個函數(shù)功能與getopt_long相同,只是可以使用’-‘后面跟長選項(xiàng)名,如./main -username jackie
相關(guān)文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內(nèi)2025-04-16如何在Linux查看硬盤信息? 查看Linux硬盤大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過程中,查看和了解硬盤信息是非常重要的工作,尤其是對于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤信息?以下是具體內(nèi)容介紹2025-03-12如何在 Linux 中查看 CPU 詳細(xì)信息? 3招輕松查看CPU型號、核心數(shù)和溫度
在日常運(yùn)維工作中,獲取 CPU 信息是系統(tǒng)運(yùn)維管理員常見的工作內(nèi)容,無論是為了性能調(diào)優(yōu)、硬件升級還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨(dú)樹一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡化,優(yōu)化,現(xiàn)代化,實(shí)用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來簡要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機(jī)U盤?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個win11裝機(jī)u盤,詳細(xì)如下2025-02-17Rsnapshot怎么用? 基于Rsync的強(qiáng)大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過 SSH 備份遠(yuǎn)程文件,接下來詳細(xì)介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時、每天、每周和每月的本地備份,以及如何進(jìn)2025-02-06Linux Kernel 6.13發(fā)布:附更新內(nèi)容及新特性解讀
Linux 內(nèi)核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡化內(nèi)核搶占邏輯,通過減少與調(diào)度器相關(guān)的調(diào)用次數(shù),讓內(nèi)核在運(yùn)行時表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領(lǐng)創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預(yù)覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內(nèi)核版本為 Linux 6.8,這次更新帶來了諸多優(yōu)化和改進(jìn),進(jìn)一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領(lǐng)域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來看看詳細(xì)安裝指南2025-01-16