一、关于命令行参数

Linux的命令行参数可以分为两类,一类是短选项,一类是长选项。短选项在参数前加一杠"-",长选项在参数前连续加两杠"--",如下表(ls 命令参数)所示,其中-a,-A,-b都表示短选项,--all,--almost-all, --author都表示长选项。他们两者后面都可选择性添加额外参数。比如--block-size=SIZE,SIZE便是额外的参数。

二、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;
};

四列的含义分别为:
(1)name:选项名称,如env、listkey、bid等。
(2)has_arg:描述长选项是否有选项参数,如果有是哪种类型,见下表:
    1)no_argument(0):选项没有参数
    2)required_argument(1):选项需要参数
    3)optional_argument(2):选项参数可选
注:我测试下来单纯设置此参数(optional_argument)没啥用,相反设置optstring中该选项为两个"::"才有用)
(3)flag:
    1)该指针为NULL,则getopt_long返回val字段(一般都这样);
    2)该指针不为NULL,val字段的值填入所指向的结构;
(4)val:
    1)flag为空时表示getopt_long函数找到该选项的返回值,即下面的opt(一般flag都为空)。
    2)flag不为空时指定flag指向的数据的值val。

4、longindex:longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值。

5、四个全局变量

(1)optarg:表示当前选项对应的参数值(均为字符串);
    (2)optind:表示下一个将被处理到的参数在argv中的下标值;
    (3)opterr:最后一个未知选项。
    (4)optopt:如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
举个例子:
    如果命令行的参数是 -l keyname ,那么调用getopt_long()将返回字符'l',并且将字符串"keyname"由optarg返回
    (注意!!!字符串keyname由optarg带回!optarg不需要定义,在getopt.h中已经有定义)。

6、返回值:
  (1)如果短选项找到,那么将返回短选项对应的字符。
  (2)如果长选项找到,如果flag为NULL,返回val。如果flag不为空,返回0
  (3)如果遇到一个选项没有在短字符、长字符里面。或者在长字符里面存在二义性的,返回“?”
  (4)如果解析完所有字符没有找到(一般是输入命令参数格式错误,eg: 连斜杠都没有加的选项),返回“-1”
  (5)如果选项需要参数,忘了添加参数。返回值取决于optstring,如果其第一个字符是“:”,则返回“:”,否则返回“?”。
注意:
  (1)longopts的最后一个元素必须是全0填充,否则会报段错误
  (2)短选项中每个选项都是唯一的。而长选项如果简写,也需要保持唯一性。

三、实例程序

#include<iostream>
#include<getopt.h>
#include<stdlib.h>
#include<sys/time.h>
#include<unistd.h>using namespace std;
/*我感觉平时用到的就两种:
(1)对于“有选项就要有参数”就用“:”和“required_argument”,如e/l/b/s/o/t/c。
(2)对于“有选项不需参数”就用“:”和“no_argument”,如h。
*/
//注:short_options 和 long_options,两个都是要用这些选项的好像。
static const char *short_options = "e:l:b:c:s:o:t:h";
static const struct option long_options[] =
{{ "env", required_argument, NULL, 'e' },{ "listkey", required_argument, NULL, 'l' },{ "bid", required_argument, NULL, 'b' },{ "size", required_argument, NULL, 's' },{ "order", required_argument, NULL, 'o' },{ "time", required_argument, NULL, 't' },{ "column", required_argument, NULL, 'c' },{ "help", no_argument, NULL, 'h' },{ 0, 0, 0, 0 } };
//注意点1:long_options的最后一个元素必须是全0填充,否则会报段错误;int main(int argc,char* argv[]){int opt = 0;int env = 0;std::string listkey;std::string columns;int bid = 0;int size = 20;int order = 1;struct timeval now;gettimeofday(&now,NULL);unsigned long ref_time = now.tv_sec * 1000000 + now.tv_usec;/*注意点2:举个例子:如果命令行的参数是 -l keyname,那么调用getopt_long将返回字符'l',并且将字符串"keyname"由optarg返回(注意!!!字符串keyname由optarg带回! optarg 不需要定义,在getopt.h中已经有定义)*///注意点3:如果解析完所有字符没有找到,返回“-1”(辅助option数组最后一项全零,用于退出循环)。while ((opt = getopt_long(argc, argv, short_options, long_options, NULL))!= -1){switch (opt){case 'h'://注意点4:如果遇到一个选项没有在短字符、长字符里面。或者在长字符里面存在二义性的,返回“?”.case '?':fprintf(stdout,"Usage: %s \n-e <env>  \n-l <listkey>  \n-b <bid>  \n-c <column>  \n-b <bid>  \n-s <size>   \n-t <time>  \n-o <order>  \n[-h]\n",argv[0]);return 0;case 'e'://将字符串转换成整数。env = atoi(optarg);cout << "env is:"<< env << endl;break;case 'l':listkey = optarg;cout << "listkey is:" << listkey << endl;break;case 'c':columns = optarg;cout << "columns is:" << columns << endl;break;case 'b':if (optarg){bid = atoi(optarg);cout << "bid is:" << bid << endl;}break;case 's':if (optarg){size = atoi(optarg);cout << "size is:" << size << endl;}break;case 't':if (optarg){ref_time = atol(optarg);cout << "ref_time is:" << ref_time << endl;}break;case 'o':if (optarg){order = atol(optarg);cout << "order is:" << order << endl;}break;}}
}

Linux命令行解析参数之getopt_long相关推荐

  1. 浅谈linux的命令行解析参数之getopt_long函数

    前言 在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析 ...

  2. C语言自己实现ls -al 功能,支持更换目录。 利用LINUX命令行解析,实现ls,总结船长

    ls -a -l 要读入命令行,就读入-,后面的a和l是体现性质的作用 这个过程用C语言实现是困难的,需要用脚本语言 1.希望实现的功能如下: 流程图: 2. 用到的知识点: man 3 getopt ...

  3. 一个自建的Java命令行解析参数类ArgumentsParser

    文章目录 1 简介 2 参数格式定义 3 类功能介绍 3.1 初始化 3.2 主要函数 4 源代码 5 输出结果 6 小结 1 简介 在前文中,介绍了一个Python中的 argparse.Argum ...

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

    参考文章:浅谈linux的命令行解析参数之getopt_long函数 文章目录 前言 一.关于命令行参数 二.getopt_long函数 参数以及返回值介绍(以上三个函数都适用): 1.argc和ar ...

  5. linux c 命令行解析 getopt getopt_long optarg optind opterr optopt 简介

    目录 getopt 函数 测试代码 getopt_long函数 代码示例 getopt 函数 头文件 #include<unistd.h> 定义函数 int getopt(int argc ...

  6. Linux命令行抓包及包解析工具tshark(wireshark)使用实例解析

    在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析. 最近才发现,原来wire ...

  7. LInux命令行参数

    原创: Linux 微知识 在大学里面,老师一般会这样教,定义main 函数应该是这样的: 甚至是这样的: 但是其实在 Linux 下,一个正确的main 函数应该被定义为如下: 大家可以看到,mai ...

  8. linux命令行下命令参数前的一横(-)和两横(--)的区别

    linux命令行下命令参数前的一横(-)和两横(--)的区别 原文转自:http://blog.csdn.net/songjinshi/article/details/6816776 在解释这些区别之 ...

  9. Go 的 flag 包可以解析命令行的参数

    Go 的 flag 包可以解析命令行的参数. 一.命令行语法 命令行语法主要有以下几种形式: cmd -flag       // 只支持bool类型 cmd -flag=xxx cmd -flag ...

  10. jq输出文本_如何用 Linux 命令行工具解析和格式化输出 JSON | Linux 中国

    我们将使用 Linux 上的命令行工具解析并格式化打印 JSON.它对于在 shell 脚本中处理大型 JSON 数据或在 shell 脚本中处理 JSON 数据非常有用.-- Ostechnix J ...

最新文章

  1. PHP tcp短链接,http请求怎样实现TCP长连接、短连接
  2. Gif(1)-加载视图-交替圆效果
  3. spacy库的安装与使用_PythonEEG工具库MNEPython详细安装与使用
  4. 深入浅出JMS(一)——JMS简单介绍
  5. Android系列之Fragment(二)----Fragment的生命周期和返回栈
  6. c语言指针大全,C语言指针
  7. request获得请求参数
  8. Java并发编程实战————恢复中断
  9. C# 各种字符串格式
  10. 使用Elasticsearch,Kafka和Cassandra构建流式数据中心
  11. Robotframework--随机选取下拉框的字段值进行搜索
  12. ViewState使用兼谈序列化
  13. python 量化模型_量化策略 | Python tqsdk — GhostTrader模型!(附代码)
  14. 局域网计算机共享加密码,局域网文件共享设置密码的方法
  15. java 输入流详解_java输入输出流详解
  16. 利用Greenfoot制作简单的小游戏——记忆翻牌游戏(一)
  17. vmware不显示usb图标解决办法
  18. Java-数组和方法(day6-7)
  19. HRBUST1313 火影忍者之~静音
  20. python毒酒检测_Turkey HSD检验法/W法

热门文章

  1. 武汉大学计算机学院毕业选题,《计算机毕业论文写作指导》
  2. L1-051 打折 (5 分)—团体程序设计天梯赛
  3. [技术博客]使用wx.downloadfile将图片下载到本地临时存储
  4. React的单向数据流与组件间的沟通
  5. C++-Qt【1】-退出程序静态调试
  6. 第一次冲刺个人博客04
  7. 再回首,Java温故知新(六):Java基础之变量
  8. “我爱淘”冲刺阶段Scrum站立会议3
  9. 双点双向路由引入/路由重发布
  10. of python检索文献 science web_查SCI文献,不知道检索方法怎么行!