1、main函数参数形式

int main(int argc , char *argv[] , char *env[]);
//第一个参数argc代表命令行的参数个数
//第二个参数依次指向各个参数,如"ls -l",argv[0]指向"ls",argv[1]指向"-l",argv[2]为NULL
//第三个参数为当前进程环境变量列表

2、命令行参数识别

在命令行输入命令时,选项的位置是随意的,如ls -l -a 与ls -a -l的效果是一样的

2.1、getopt(int argc , char *argv[] , char *optstring)   引入头文件"unistd.h"

第一个参数、第二个参数同main函数的前两个参数,第三个参数optstring定义了选项和参数的形式

(1)单个字符表示该选项没有参数

(2)单个字符后面接单个冒号,表示该选项后面必定有参数,且以空格分隔选项和参数

(3)单个字符后面接双冒号,表示该选项后可以有参数也可以没有参数;若有参数,参数必须紧跟在选项后

如:

ab:c::

选项a没有参数;选项b有一个参数且用空格分隔;选项c可以有参数也可以没有参数,若有参数,参数必须紧跟在选项后

此外还有4个与getopt相关的全局变量

int optopt:存储未满足optstring规定的选项

char *optarg:指向当前选项的参数指针

int optind:确定选项和对应参数后,指向下一个argv参数

int opterr:若设为0,则getopt不想stderr输出错误信息

调用原理:

每次调用完getopt,都会返回对应的选项,使得optarg指向该选项对应的参数。若选项不满足optstring的规则,则返回‘?’,并将该选项存入optopt;若解析完毕则返回-1。

解析完毕后,getopt会重新排列argv中的参数,所有不符合要求的选项和参数被放到argv的最后(其中选项在前、参数在后),并使optind指向这些不符合要求的选项参数在argv中的起始下标。

   #include <stdio.h>
#include <unistd.h> int main(int argc ,char ** argv ,char ** env){
int res;
opterr=; //不显示错误信息
while((res = getopt(argc , argv , "ab:c::")) != -){
switch(res){
case 'a':
printf("option=a\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);
break;
case 'b':
printf("option=b\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);
break;
case 'c':
printf("option=c\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);
break;
case '?':
printf("option=?\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);
break;
} }
printf("OVER\noptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]); //打印三个全局变量最终值
int i = ;
printf("******************************************\n");
for(; i < argc ; i++){ //打印重新排列后的命令行参数
printf("%s\n",argv[i]);
}
}

sudo ./main -a -b bbb -c ccc -d ddd
option=a  optarg=(null)  optopt=  optind=2  argv[optind]->-b
option=b  optarg=bbb  optopt=  optind=4  argv[optind]->-c
option=c  optarg=(null)  optopt=  optind=5  argv[optind]->ccc
option=?  optarg=(null)  optopt=d  optind=7  argv[optind]->ddd
OVER
optarg=(null)  optopt=d  optind=6  argv[optind]->ccc
******************************************
-a
-b
bbb
-c
-d
ccc
ddd

2.2、getopt_long

它不仅能识别短选项(命令 -短选项),而且还支持长选项(命令 --长选项)。

int getopt_long(int argc , char **argv , char * shortOpt ,struct option * longOpt, int *index)   注意:struct option 要引入头文件”getopt.h“

前三个参数同getopt的参数,shortOpt定义的短选项及参数的形式。

第四个参数定义的是结构体option数组,

第五个参数记录长选项位于longOpt数组的下标,一般情况下设为NULL

struct option{
  const char *name;  //长选项名称
  int has_arg;  //0表示该选项没有参数,1表示必须有参数,2参数为可选
  int *flag; //一般为NULL,则getopt_long返回val;否则,将val的值赋给flag所指向的整形变量,函数返回值为0
  int val;  //一般设为长选项对应的短选项,若flag为NULL,则val作为函数的返回值。否则将val赋给flag所指向的变量
};

若不想支持短选项,则让shortOpt为”“空字符串即可,但不能设为NULL。

   #include <stdio.h>
#include <unistd.h>
#include <getopt.h>
int main(int argc , char **argv , char **env){
int res; //保存函数返回值
struct option longOption[]={ //定义长选项数组
{"help",,NULL,'h'},
{"version",,NULL,'v'},
{"output",,NULL,'o'},
{NULL,,NULL,}
};
opterr=; //不输出错误信息
int index; //长选项位于longOption的下标
while( - != (res = getopt_long(argc , argv , "hvo:",longOption ,&index))){
switch(res){
case 'h':
printf("option=help\n");
break;
case 'v':
printf("option=version\n");
break;
case 'o':
printf("option=output,output path=%s\n",optarg);
break;
case '?':
printf("error\n");
break;
}
printf("index in longOption is %d\n",index);
} return ;
}

输出:

sudo ./main -h
option=help
index in longOption is -1218614280   //对于短选项,函数的第五个参数无效

sudo ./main -o /home/out
option=output,output path=/home/out
index in longOption is -1219220488

sudo ./main --version
option=version
index in longOption is 1

sudo ./main --output /home/out
option=output,output path=/home/out
index in longOption is 2

Linux命令行选项及参数的更多相关文章

  1. argparse - 命令行选项与参数解析(转)

    argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...

  2. getopt:命令行选项、参数处理

    在写shell脚本时经常会用到命令行选项.参数处理方式,如: ./test.sh -f config.conf -v --prefix=/home -f 为短选项,它需要一个参数,即config.co ...

  3. 【makefile】make程序的命令行选项和参数

    Make命令参数的典型序列如下所示: make [-f makefile文件名][选项][宏定义][目标] 这里用[]括起来的表示是可选的.命令行选项由破折号“–”指明,后面跟选项,如: make – ...

  4. 脚本乐园 Shell中命令行选项和参数的处理

    在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:在bash中,可以用以下三种方式来处理命令行参数 ...

  5. 【视频】Linux高级程序设计01.3命令行选项及参数

    [课程笔记] [命令行参数] 选项:-l -a -i 参数:-l /home main 函数形式: int main(int argc, char *argv[]) main函数是有参数的,而且有返回 ...

  6. argparse - 命令行选项与参数解析

    argparse模块作为optparse的一个替代被添加到Python2.7.argparse的实现支持一些不易于添加到optparse以及要求向后不兼容API变化的特性,因此以一个新模块添加到标准库 ...

  7. python argparse模块:命令行选项及参数解析

    位置参数:给一个例子: import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") ...

  8. 9、getopt的用法,被用来解析命令行选项参数

    #include <unistd.h>       extern char *optarg;  //选项的参数指针       extern int optind,   //下一次调用ge ...

  9. 命令行选项解析函数(C语言):getopt()和getopt_long()

    命令行选项解析函数(C语言):getopt()和getopt_long() 上午在看源码项目webbench时,刚开始就被一个似乎挺陌生函数getopt_long()给卡住了,说实话这函数没怎么见过, ...

随机推荐

  1. dede文章页调用当前栏目链接方法

    DedeCMS内容页调用当前栏目其实用下来是调用不出来的,{dede:field.typename/}是有效的,可是 {dede:field.typeurl/}却调不出文档当前栏目所在目录链接URL. ...

  2. Servlet中的cookie和session

    保存数据的2中方式 Cookie Session Cookie 我们可以将一些信息保存到cookie中,cookie存放在对应的浏览器目录里面.每个站点可以保存20个cookie,最大长度不超过4k. ...

  3. 使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间

    http://zhangrenfang8738.blog.163.com/blog/static/95401881201142711450245/ curl监控站点响应时间 2011-05-27 11 ...

  4. 在delphi的exe文件中嵌入另外一个exe文件

    http://www.cnblogs.com/dabiao/archive/2009/11/28/delphi.html 1.创建rc文件.可以用任意文本编辑器来写.文件格式为:"资源名 资 ...

  5. EXT dateRange

    VTYPES: Ext.apply(Ext.form.VTypes, { daterange: function (val, field) { var date = field.parseDate(v ...

  6. C++ primer 练习9.49

    如果一个字母延伸到中线之上,如d或f,则称其有上出头部分.如果一个字母延伸到中线之下,如p或g, 则称其有下出头部分.编写程序,读入一个单词,输出最长的即不包含上出头部分,也不包含下出头部分单 词. ...

  7. App can入门

    主干 主干可以认为是整个页面的整体框架布局 上图是截取与ZAKER(原生开发).正益无线(HTML5开发).ZAKER微博界面(原生开发)和HTML5中国(HTML5开发).参考上述界面我们看到大部分 ...

  8. (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在

    问题描述:在用vs生成MVC时若使用Internet应用程序为模版,项目建好后重新编译下无法通过,弹出错误: 解决方案:问题出来后,询问了身边很多人都是一头雾水,于是乎各种谷歌和百度,还好功夫不负有心 ...

  9. Eclipse is running in a JRE, but a JDK is required 解决方法

    本文非原创,转自http://liguoliang.com/2010/eclipse-is-running-in-a-jre-but-a-jdk-is-required/ 安装Maven后每次启动出现 ...

  10. android 如何设置背景的透明度

    半透明<Button android:background="#e0000000" ... />透明<Button android:background=&quo ...