命令行参数解析之getopt

2023-12-06 06:08
文章标签 参数 解析 命令行 getopt

本文主要是介绍命令行参数解析之getopt,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文作者: 阿宝 | 彩色世界
本文链接: https://blog.ibaoger.com/2017/08/08/getopt-long/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

简介

getopt作为Linux下经典的命令行解析工具,得到广泛的使用,下面简单的作一下介绍。

定义

getopt提供了4个变量、1个结构体、3个外部接口、1个内部接口:

char *optarg;
int optind;
int opterr;
int optopt;struct option
{
#if defined (__STDC__) && __STDC__const char *name;
#elsechar *name;
#endifint has_arg;int *flag;int val;
};int getopt (int argc, char *const *argv, const char *optstring)int getopt_long (int argc,  char *const *argv,  const char *options,const struct option *long_options, int *opt_index)int getopt_long_only (int argc, char *const *argv, const char *options,const struct option *long_options, int *opt_index)int _getopt_internal (int argc, char *const *argv, const char *optstring,const struct option *longopts, int *longind, int long_only)

optarg

optarg用于从getopt到调用者的交互。
当 getopt 找到带参数的选项时,optarg 被赋值为这个参数;当枚举变量 ordering 等于 RETURN_IN_ORDER 时,没有选项的参数赋值给 optarg。

optind

ARGV中将要被处理的下一个元素的下标。用于和调用者交互,并连续调用getopt。
在进入getopt时,零表示这是第一个调用; 初始化。当getopt返回-1时,表示这是第一个没有选项的参数,需要调用者自己做处理。正常情况下,optind表示ARGV中已经处理的元素个数。

opterr

当getopt遇到无法识别的选项时,调用者通过给opterr赋值零来阻止打印错误消息。

optopt

optopt表示无法识别的选项字符。

struct option

描述应用程序中使用到的长名称选项。
getopt_long或getopt_long_only方法中的LONG_OPTIONS参数,是一个option结构体的容器,并以名称为零的元素结尾。

has_arg
no_argument(0) 代表此选项没有参数;
required_argument(1) 代表此选项需要参数;
optional_argument(2) 代表此选项的参数可有可无;

flag
当flag不等于零时,如果找到选项,那么选项的参数被赋值为val变量;否则不作任何修改;

在使用长名称选项时,除了将int设置为编译常量之外,还需要设置一个来自optarg的值,设置flag为零,设置val为非零(等效的单字母选项,如果有的话)。对于flag字段为零的长选项,getopt返回val字段的值。

getopt

短名称选项的解析。

getopt_long

兼容长名称和短名称选项的解析。

getopt_long_only

长名称选项的解析。

_getopt_internal

长短名称选项的内部解析实现。从给定的OPTSTRING字符串中,搜索(长度为ARGC)ARGV的元素中相匹配的字符选项。

如果ARGV元素以 - 符号开始,并且不等于 - 或 – 那么这个元素是选项,这个元素中的字符是选项的名称。当调用循环getopt时,将成功返回每个元素中的字符。

当getopt找到选项时,将返回元素中的字符,并更新optind和nextchar变量,以便下次搜索时使用。

当查找完成后,getopt返回-1。此时optind被赋值为ARGV中第一个非选项的下标。

OPTSTRING是一个包含合法选项字符的字符串。如果ARGV中的元素不在OPTSTRING中时,getopt输出错误住处,并返回?。当设置opterr为零时,不输出错误,仍返回?。如果OPTSTRING以 - 或 + 符号开始,那么你需要自己处理非选项的ARGV元素。详情参阅RETURN_IN_ORDER和REQUIRE_ORDER的说明。

长名称选项以 – 符号开始,名称可以使用全称或缩写,并保证名称的唯一性。长选项的参数,可以放在长选项的下一个元素,也可以通过 = 紧跟在长选项的后面。当getopt'发现一个长命名选项时,如果该选项的flag’字段为非零,则返回零,如果’flag’字段为零,则返回该选项的’val’字段的值。

ARGV中的元素并不是真正的常量。我们当作常量来使用,以保证与其他系统的兼容性。

LONGOPTS是一个option结构体的容器,并以名称为零的元素结尾。
LONGIND代表长名称选项在LONGOPT中的下标。仅在长名称选项匹配成功时有效。
LONG_ONLY为非零时,- 符号和 – 符号一样代表长名称的起始。

示例

int main(int argc, char **argv)
{int c;int digit_optind = 0;while (1){int this_option_optind = optind ? optind : 1;int option_index = 0;static struct option long_options[] ={{"add", 1, 0, 0},{"append", 0, 0, 0},{"delete", 1, 0, 0},{"verbose", 0, 0, 0},{"create", 0, 0, 0},{"file", 1, 0, 0},{0, 0, 0, 0}};c = getopt_long(argc, argv, "abc:d:0123456789",long_options, &option_index);if (c == -1)break;switch (c){case 0:printf("option %s", long_options[option_index].name);if (optarg)printf(" with arg %s", optarg);printf("\n");break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':if (digit_optind != 0 && digit_optind != this_option_optind)printf("digits occur in two different argv-elements.\n");digit_optind = this_option_optind;printf("option %c\n", c);break;case 'a':printf("option a\n");break;case 'b':printf("option b\n");break;case 'c':printf("option c with value `%s'\n", optarg);break;case 'd':printf("option d with value `%s'\n", optarg);break;case '?':break;default:printf("?? getopt returned character code 0%o ??\n", c);}}if (optind < argc){printf("non-option ARGV-elements: ");while (optind < argc)printf("%s ", argv[optind++]);printf("\n");}exit(0);
}

这篇关于命令行参数解析之getopt的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/460717

相关文章

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与