Linux命令行解析参数之getopt_long
一、关于命令行参数
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相关推荐
- 浅谈linux的命令行解析参数之getopt_long函数
前言 在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析 ...
- C语言自己实现ls -al 功能,支持更换目录。 利用LINUX命令行解析,实现ls,总结船长
ls -a -l 要读入命令行,就读入-,后面的a和l是体现性质的作用 这个过程用C语言实现是困难的,需要用脚本语言 1.希望实现的功能如下: 流程图: 2. 用到的知识点: man 3 getopt ...
- 一个自建的Java命令行解析参数类ArgumentsParser
文章目录 1 简介 2 参数格式定义 3 类功能介绍 3.1 初始化 3.2 主要函数 4 源代码 5 输出结果 6 小结 1 简介 在前文中,介绍了一个Python中的 argparse.Argum ...
- C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)
参考文章:浅谈linux的命令行解析参数之getopt_long函数 文章目录 前言 一.关于命令行参数 二.getopt_long函数 参数以及返回值介绍(以上三个函数都适用): 1.argc和ar ...
- linux c 命令行解析 getopt getopt_long optarg optind opterr optopt 简介
目录 getopt 函数 测试代码 getopt_long函数 代码示例 getopt 函数 头文件 #include<unistd.h> 定义函数 int getopt(int argc ...
- Linux命令行抓包及包解析工具tshark(wireshark)使用实例解析
在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析. 最近才发现,原来wire ...
- LInux命令行参数
原创: Linux 微知识 在大学里面,老师一般会这样教,定义main 函数应该是这样的: 甚至是这样的: 但是其实在 Linux 下,一个正确的main 函数应该被定义为如下: 大家可以看到,mai ...
- linux命令行下命令参数前的一横(-)和两横(--)的区别
linux命令行下命令参数前的一横(-)和两横(--)的区别 原文转自:http://blog.csdn.net/songjinshi/article/details/6816776 在解释这些区别之 ...
- Go 的 flag 包可以解析命令行的参数
Go 的 flag 包可以解析命令行的参数. 一.命令行语法 命令行语法主要有以下几种形式: cmd -flag // 只支持bool类型 cmd -flag=xxx cmd -flag ...
- jq输出文本_如何用 Linux 命令行工具解析和格式化输出 JSON | Linux 中国
我们将使用 Linux 上的命令行工具解析并格式化打印 JSON.它对于在 shell 脚本中处理大型 JSON 数据或在 shell 脚本中处理 JSON 数据非常有用.-- Ostechnix J ...
最新文章
- PHP tcp短链接,http请求怎样实现TCP长连接、短连接
- Gif(1)-加载视图-交替圆效果
- spacy库的安装与使用_PythonEEG工具库MNEPython详细安装与使用
- 深入浅出JMS(一)——JMS简单介绍
- Android系列之Fragment(二)----Fragment的生命周期和返回栈
- c语言指针大全,C语言指针
- request获得请求参数
- Java并发编程实战————恢复中断
- C# 各种字符串格式
- 使用Elasticsearch,Kafka和Cassandra构建流式数据中心
- Robotframework--随机选取下拉框的字段值进行搜索
- ViewState使用兼谈序列化
- python 量化模型_量化策略 | Python tqsdk — GhostTrader模型!(附代码)
- 局域网计算机共享加密码,局域网文件共享设置密码的方法
- java 输入流详解_java输入输出流详解
- 利用Greenfoot制作简单的小游戏——记忆翻牌游戏(一)
- vmware不显示usb图标解决办法
- Java-数组和方法(day6-7)
- HRBUST1313 火影忍者之~静音
- python毒酒检测_Turkey HSD检验法/W法
热门文章
- 武汉大学计算机学院毕业选题,《计算机毕业论文写作指导》
- L1-051 打折 (5 分)—团体程序设计天梯赛
- [技术博客]使用wx.downloadfile将图片下载到本地临时存储
- React的单向数据流与组件间的沟通
- C++-Qt【1】-退出程序静态调试
- 第一次冲刺个人博客04
- 再回首,Java温故知新(六):Java基础之变量
- “我爱淘”冲刺阶段Scrum站立会议3
- 双点双向路由引入/路由重发布
- of python检索文献 science web_查SCI文献,不知道检索方法怎么行!