设为首页 收藏本站
查看: 545|回复: 0

[经验分享] Linux下命令行程序设计--getopt_long()函数使用说明

[复制链接]

尚未签到

发表于 2016-3-31 09:48:29 | 显示全部楼层 |阅读模式
1.Linux Command-line ConventionsLinux命令行约定)

几乎所有的GNU/Linux程序都遵循一些命令行参数定义的约定。程序希望出现的参数可以分成两种:选项(options or flags)、其他类型的的参数。Options修饰了程序运行的方式,其他类型的参数则提供了输入(例如,输入文件的名称)。

对于options类型参数可以有两种方式:
1)短选项(short options):顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写或小写字母)。例如:-s,-h等。
2)长选项(long options):长选项,包含了两个连字号和一些大小写字母组成的单词。例如,--size,--help等。
*注:一个程序通常会提供包括short options和long options两种参数形式的参数。

对于其他类型参数的说明:
这种类型的参数,通常跟随在options类型参数之后。例如,ls –s /功能为显示root目录的大小。’/’这个参数告诉ls要显示目录的路径。

2.Using getopt_long

1) getopt_long()函数说明
getopt_long()函数使用规则:

(1)使用前准备两种数据结构
² 字符指针型变量
该数据结构包括了所有要定义的短选项,每一个选项都只用单个字母表示。如果该选项需要参数(如,需要文件路径等),则其后跟一个冒号。例如,三个短选项分别为‘-h’‘-o’‘-v’,其中-o需要参数,其他两个不需要参数。那么,我们可以将数据结构定义成如下形式:
const char * const shor_options = “ho:v” ;
² struct option 类型数组
该数据结构中的每个元素对应了一个长选项,并且每个元素是由四个域组成。通常情况下,可以按以下规则使用。第一个元素,描述长选项的名称;第二个选项,代表该选项是否需要跟着参数,需要参数则为1,反之为0;第三个选项,可以赋为NULL;第四个选项,是该长选项对应的短选项名称。另外,数据结构的最后一个元素,要求所有域的内容均为0,即{NULL,0,NULL,0}。下面举例说明,还是按照短选项为‘-h’‘-o’‘-v’的例子,该数据结构可以定义成如下形式:
const struct option long_options = {
{ “help”, 0, NULL, ‘h’ },
{ “output”, 1, NULL, ‘o’ },
{ “verbose”, 0, NULL, ‘v’ },
{ NULL, 0, NULL, 0 }
};

(2)使用getopt_long()的几条建议
² 调用方法
(a)我们先看一下在函数库里,getopt_long()函数是如何被声明的:
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
(b)说明一下这五个变量吧。
前两个就不必多说了,main函数的参数。第三个和第四个变量,分别是上面讲到的准备的两个数据结构。最后一个参数:longindex参数一般赋为NULL即可;如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。
(c)举例说明一下:
按以上所讲,参照(1)准备的两个数据结构,则调用方式可为:
getopt_long( argc, argv, short_options, long_options, NULL);

² 几种常见返回值
(a)每次调用该函数,它都会分析一个选项,并且返回它的短选项,如果分析完毕,即已经没有选项了,则会返回-1。
(b)如果getopt_long()在分析选项时,遇到一个没有定义过的选项,则返回值为‘?’,此时,程序员可以打印出所定义命令行的使用信息给用户。
(c)当处理一个带参数的选项时,全局变量optarg会指向它的参数
(d)当函数分析完所有参数时,全局变量optind(into argv)会指向第一个‘非选项’的位置

(3)更多内容可以参照
http://www.cublog.cn/u/18537/showart.php?id=125055

2) 应用举例


/*===============================================================
* Code listing from "Advanced Linux Programming," by CodeSourcery LLC *
===============================================================*/
#include<getopt.h>
#include<stdio.h>
#include<stdlib.h>

/*The nameofthisprogram.*/
const char*program_name;

/*Prints usage information forthisprogram to STREAM (typically
stdout orstderr),andexit the program with EXIT_CODE.Does not
return.*/

void print_usage (FILE*stream,intexit_code)
{
fprintf (stream,"Usage: %s options [ inputfile ... ]/n",program_name);
fprintf (stream,
" -h --help Display this usage information./n"
" -o --output filename Write output to file./n"
" -v --verbose Print verbose messages./n");
exit (exit_code);
}

/*Main program entry point.ARGC conains number ofargument list
elements;ARGV is an array ofpointers to them.*/

intmain (intargc,char*argv[])
{
intnext_option;

/*A string listing valid shortoptions letters.*/
const char*const short_options ="ho:v";
/*An array describing valid long options.*/
const structoptionlong_options[]={
{ "help",0,NULL,'h'},
{ "output",1,NULL,'o'},
{ "verbose",0,NULL,'v'},
{ NULL,0,NULL,0 } /*Required at end ofarray.*/
};

/*The nameofthe file to receive program output,orNULL for
standard output.*/
const char*output_filename =NULL;
/*Whether to display verbose messages.*/
intverbose =0;

/*Remember the nameofthe program,to incorporate inmessages.
The nameis stored inargv[0].*/
program_name =argv[0];

do {
next_option =getopt_long (argc,argv,short_options,
long_options,NULL);
switch (next_option)
{
case 'h':/*-h or--help */
/*User has requested usage information.Print it to standard
output,andexit with exit code zero (normal termination).*/
print_usage (stdout,0);

case 'o':/*-o or--output */
/*Thisoptiontakes an argument,the nameofthe output file.*/
output_filename =optarg;
break;

case 'v':/*-v or--verbose */
verbose =1;
break;

case '?':/*The user specified an invalid option.*/
/*Print usage information to standard error,andexit with exit
code one (indicating abonormal termination).*/
print_usage (stderr,1);

case -1:/*Done with options.*/
break;

default:/*Something else:unexpected.*/
abort ();
}
}
while(next_option !=-1);

/*Done with options.OPTIND points to first non-optionargument.
Fordemonstration purposes,print them ifthe verbose optionwas
specified.*/
if(verbose){
inti;
for(i =optind;i <argc;++i)
printf ("Argument: %s/n",argv[i]);
}
/*The main program goes here.*/
return 0;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-198100-1-1.html 上篇帖子: Linux/Unix下使用tar命令压缩和解压[tar Examples] 下篇帖子: 这两天上班无聊完Linux,记录下笔记算是总结吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表