首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么`$OPTIND`不能存在于包含getopt的函数中?

$OPTIND是一个特殊的变量,用于存储getopt函数的内部状态。getopt函数是一个用于解析命令行参数的函数,它会根据传入的参数定义和命令行参数列表,解析出各个选项和参数的值。

$OPTIND变量的作用是记录getopt函数在解析命令行参数时的当前位置。每次调用getopt函数,它都会检查$OPTIND变量来确定下一个要解析的参数的位置。

然而,getopt函数是使用C语言的全局变量和静态变量来实现的。这意味着getopt函数在不同的函数中调用时,会共享同一个$OPTIND变量。如果将getopt函数放在一个函数中,那么在其他函数中无法访问到$OPTIND变量,因为它是getopt函数的内部状态。

因此,$OPTIND不能存在于包含getopt的函数中,否则其他函数无法正确访问和使用$OPTIND变量。为了正确使用getopt函数,应该将getopt函数放在主函数或全局作用域中,以确保$OPTIND变量在整个程序中都可见和可用。

总结起来,$OPTIND不能存在于包含getopt的函数中,是因为getopt函数的内部状态无法在其他函数中访问,需要将getopt函数放在主函数或全局作用域中以确保正确使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

getopt()、getopt_long()与getopt_long_only()获取命令行参数

如果字母后跟两个冒号,则表示这个选项参数是可选,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格,否则报错,这一点和一个冒号时是有区别的。...那么optind初值为什么是1呢? 这就要涉及到main函数那两个参数了,argc表示参数个数,argv[]表示每个参数字符串,对于上面的输出argc就为3,argv[]分别为: ....所以这个命令行是符合要求。至于执行后optind为什么是3,这是因为optind是下一次进行选项搜索开始索引,也是说下一次getopt()函数要从argv[3]开始搜索。...最后要说明一下,getopt()会改变argv[]参数顺序。经过多次getopt()后,argv[]选项和选项参数会被放置在数组前面,而optind 会指向第一个非选项和参数位置。...,包含getopt()所有功能,只是增加了对长选项支持,长选项使用两个破折号–表示。

4K71

getopt解析

在命令行选项参数再也检查不到optstring包含选项时,返回-1,同时optind储存第一个不包含选项命令行参数。 首先说一下什么是选项,什么是参数。...该参数指针赋给optarg。 3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数指针赋给optarg。(这个特性是GNU扩张)。...还要注意是默认情况下getopt会重新排列命令行参数顺序,所以到最后所有不包含选项命令行参数都排到最后。...那么一遇到不包含选项命令行参数,getopt就会停止,返回-1。...参数argc和argv是由main()传递参数个数和内容。参数optstring 则代表欲处理选项字符串。此函数会返回在argv 中下一个选项字母,此字母会对应参数optstring 字母。

66510

深入理解getopt

getopt – 解析命令可选项 【说明】 getopt 只是一个简单解析命令可选项函数,只能进行简单格式命令解析,格式如下: 1、形如:cmd [-a][-b] //对短选项解析; 2、...,argc、argv 是调用 main 函数时传入参数。...传入’-‘开始字符被解析为选项,getopt 一次执行解析出一个 option,如果循环执行,可以将 argv 全部 option 解析出来; 2、在 getopt 执行,每次进入都会更新...返回 -1,这个可以用来做一些特殊处理; 返回值: 1、返回类型为 int,这个在编程时候要注意,因为返回值类型范围要包含 -1,很容易返回值接收定义为 char,但在一些系统 char 是无符号...,将导致程序错误; 2、当传入 argv 选项全部被解析,getopt() 返回 -1,这也是 getopt 进行选项解析循环截至条件; 3、如果 argv 解析出 optstring 描述选项字符

1.3K10

getopt函数

getopt函数 函数说明 getopt -- 解析命令可选项 getopt只是一个简单解析命令可选项函数,只能进行简单格式命令解析,格式如下: 对短选项解析:cmd [-a][-b] 对短选项及短选项参数解析...*optstring); 描述: getopt函数解析命令行参数,argc、argv是调用main函数时传入参数。...传入’-‘开始字符被解析为选项,getopt一次执行解析出一个option,如果循环执行,可以将argv全部option解析出来; 在getopt执行,每次进入都会更新optind变量,该变量指向下一个...argv参数; 如getopt返回-1,表示argv[]所有选项被解析出,optind指向第一个非选项argument元素;这里要注意,在getopt执行过程中会将单独argument交换到argv...char,但在一些系统char是无符号,将导致程序错误; 当传入argv选项全部被解析,getopt()返回-1,这也是getopt进行选项解析循环截至条件; 如果argv解析出optstring

33130

浅谈linux命令行解析参数之getopt_long函数「建议收藏」

大家好,又见面了,我是你们朋友全栈君。 前言 在linux,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析呢?...通常使用GNU C提供函数getoptgetopt_long、getopt_long_only函数来解析命令行参数。...二、getopt_long函数 getopt函数只能处理短选项,而getopt_long函数两者都可以,可以说getopt_long已经包含getopt_long功能。...因此,这里就只介绍getopt_long函数。而getopt_long与getopt_long_only区别很小,等介绍完getopt_long,在提起会更好。...5、全局变量: (1)optarg:表示当前选项对应参数值。 (2)optind:表示是下一个将被处理到参数在argv下标值。

1.1K30

命令行參数选项处理:getopt()及getopt_long()函数使用

两个冒号”::”代表这个选项參数是可选getopt返回值是argv数组下一个选项參数。...由optind记录argv数组下标,假设选项參数处理完成,函数返回-1; 假设遇到一个无法识别的选项,返回问号(?)。并保存在optopt; 假设一个选项须要一个关联值。...,假设将optstring第一个字符设为冒号(:),这样情况下,函数会返回冒号而不是问号。 选项參数处理完成后。optind会指向argv数组尾部其它非选项參数。 实际上。...getopt() 所设置全局变量(在unistd.h包含: optarg——指向当前选项參数(假设有)指针。...optind—— getopt() 即将处理下一个參数 argv 指针索引。 optopt——最后一个已知选项。

52630

bashshell 解析命令行参数工具:getoptsgetopt

如果命令行包含了没有在getopts列表选项,会有警告信息,如果在整个getopts字符串前面也加上个:,就能消除警告信息了。...操作中有两个相对固定“常量”,一个是OPTARG,用来取当前选项值,另外一个是OPTIND,代表当前选项在参数列表位移。注意case最后一个选择──?...使用getopts处理参数虽然是方便,但仍然有两个小小局限: 1.选项参数格式必须是-d val,而不能是中间没有空格-dval。...使用getopt时, 在命令行输入位置参数是什么, 在getopt需要保持原样, 比如 -t , 在getoptcase语句中也要使用-t,  而getopts不要前面的-。...另外还要注意到是,在使用 getopt 处理完参数之后,"${@}" 变量 “被清洗干净了” ,里面包含了所有不带 "-" 或 "–" 参数,所以你可以继续使用 ${1},${2} 等来调用他们。

10.7K90

CC++ 命令解析:getopt 方法详解和使用示例

大家好,又见面了,我是你们朋友全栈君。 一、简介 getopt() 方法是用来分析命令行参数,该方法由 Unix 标准库提供,包含在 头文件。...int optind, opterr, optopt; getopt 参数说明: argc:通常由 main 函数直接传入,表示参数数量 argv:通常也由 main 函数直接传入,表示参数字符串变量数组...例如 “abc:”,其中 -a,-b 就表示两个普通选项,-c 表示一个必须有参数选项,因为它后面有一个冒号 外部变量说明: optarg:如果某个选项有参数,这包含当前选项参数字符串 optind...字符,optopt 包含就是发现无效选项字符 三、实例分析 让我们通过一系列实例来掌握 getopt 方法使用吧。 1....atoi (表示 ascii to integer) 是把字符串转换成整型数一个函数包含在 头文件,使用方式如下: int num = atoi(optarg); 发布者:

1.1K51

getopt 可能重排参数

看第21章时,介绍到了解析命令行神器 getopt,了解了 linux 下处理通用命令行方法。...如何简化呢,就是通过定义一个可接受选项“模板”,然后通过不停调用 getopt 来将所有选项解析出来, 最后剩下就是不能被识别的参数了,但是这种场景就简单了,只需按顺序处理它们即可。...相关设施 (optind/optarg/optopt) 返回值,以便可以观察它们随着选项解析后变化。...其中括号optind 代表值,表示下一个输入在 argv 位置。 当所有选项解析完成后,这个位置将被更新到结尾或第一个参数位置(如果有)。...我一直有个疑问,如果当参数夹杂在选项时,这个位置是定位到哪里呢? 如果定位到那个参数位置,那么应用在向后遍历剩余参数时,岂不是会遍历到已经解析选项? 如果不是,那岂不是漏掉了一个参数?

42530

如何优雅地处理命令行参数?

函数声明 getopt就可以非常方便地处理简单参数了,其声明如下: #include extern int optind,opterr,optopt; extern char *optarg...外部变量 它有四个外部变量,含义分别如下: optind 存放下一个要处理字符串在argv数组下标,从1开始 opterr 如果选项发生错误,getopt会打印出错消息,如果设置为0,则不打印。...来源:公众号【编程珠玑】 网站:https://www.yanbinghu.com 长选项处理 为了应对前面说这种情况,需要用到下面两个函数一个: #include int...在getopt_long_only,optstring可以为“”。...如果想要-help也被当成长选项,那么就需要用到getopt_long_only函数了。 最后,再完整用一遍: $ .

1K10

getopt用法说明

一.函数模型 #include int getopt(int argc, char * const argv[], const...optind——再次调用 getopt() 时下一个 argv 指针索引。 optopt——最后一个未知选项。 二.说明 1.简要用法 函数说明 getopt()用来分析命令行参数。...参数argc和argv分别代表参数个数和内容,跟main()函数命令行参数是一样。...2.补充说明 optstring指定内容意义(例如getopt(argc, argv, “ab:c:de::”);) 1.单个字符,表示选项,(如上例abcde各为一个选项) 2....该参数指针赋给optarg。(如上例b:c:) 3 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。

51300

GDB读取动态库定义全局变量错误

最近看了一篇getopt使用文章,为了追踪其执行逻辑,于是采用GDB挂载调试方式进行查看。但却出现了GDB打印全局变量optind时候出现错误。...问题发现和描述 首先optind是使用getopt时候全局变量,表示使用getopt时候下一个argv指针索引。...在应用程序调试时候设置了多个参数,但是随着多次调用getopt,全局变量optind通过gdb打印出来值却总是1, 但是通过程序打印出来optind确实是逐步变化。....BSS段全局变量来访问原先动态库定义全局变量。...首先我们通过"Info var optind"查看下optind相关信息,可以看到两处指名了optind出处,第一处其实说明了这个是在libc.so定义,而gdb默认打印也是libc.so定义

2.1K30

你还不知道argc,argv是什么?

这里有个函数给大家介绍下 #include int getopt(int argc, char * const argv[], const char *optstring...); extern char *optarg; extern int optind, opterr, optopt; 函数说明:getopt()用来分析命令行参数。...在linux下大家都用过这样一条指令: gcc -o main main.cpp 这条指令-o就是命令行选项,后面的main是-o选项所携带参数 有些选项是不用带参数,而这样不带参数选项可以写在一起...参数输入形式 -p80 或者 -p 80,都表示 80 是 -p 参数。 两个冒号就表示这个选项参数是可选,即可以有参数,也可以没有参数。 ps:需要注意是两个冒号之间不能有空格。...解析参数 了解完选项和选项参数之后就是通过getopt这个函数解析参数了 在此之前了解一下几个全局参数 extern char *optarg;` 用来保存选项参数 extern int optind

1.2K20

PHP脚本指南-解析GNU C风格命令行选项

2020年新年第一文,冲鸭~来说一下PHP脚本开发时如何去解析对应命令行选项 获取脚本名称 我们先来说一下如何获取当前执行脚本是什么,我们可以使用$argv来获取,$argv包含当运行于命令行下时传递给当前脚本参数数组...当我们在获取命令行参数时,可以通过遍历$argv来获取,遍历这里就不说了,提供一个代码段,见GithubGist 我们来说一下PHP使用 getopt 这个函数来解析命令行选项,PHP手册地址 getopt...( string $options [, array $longopts [, int &$optind ]] ) : array 参数分为短参数名、完整参数名和optind,但是PHP缺少了长短选项映射关系配置...,比如-v和--version,-h和--help等 $options短参数字符列表,该字符串每个字符会被当做选项字符,匹配传入脚本选项以单个连字符-开头。...只允许 a-z、A-Z 和 0-9 $longopts长参数字符列表,此数组每个元素会被作为选项字符串,匹配了以两个连字符--传入到脚本选项。

1.2K70

生信(11)htslib处理bam或sam文件简单示例

其实,htslib这个库提供API基本上都在一些头文件(.h文件)。比如htslib库sam.h文件就包含了很多实用API。很多头文件说明还是很详细,多看看慢慢地就会熟悉了。...由于test_view.c还是很长,笔者据此进行修改,写了一个更简单示例,命名为samtest.c。这个程序作用是从bam/sam文件中提取全部或者部分区域比对结果(不包含头部信息)。...; bam1_t 结构:储存了一条比对结果信息; hts_idx_t结构:储存了index文件信息; hts_itr_t结构:是一个迭代器,每次返回一条比对结果; 这些结构都有对应函数对它们进行处理...比如sam_hdr_read(htsFile*)可以读取sam文件头部信息。其它函数作用可以参考官网上头文件。 编译c程序 为什么要将编译单独写一小节呢?...如果不能正确加载该动态链接库,程序会报错,像这样: ? 不同系统具有不同加载链接库方法。

1.9K21

PHP通过getopt解析GNU C风格命令行选项

在 PHP ,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循,也就是 GNU C-style parser for command line options 。...总结 options 使用规范 短参数名,有一个限制,只能是一个char字符,只能1字节,不能超过1字节,比如上面的第四个命令最后一个参数就不知道是一个参数还是三个参数了。...,可选传值(也就是可传可不传) 在 PHP 使用 getopt ( string $options [, array $longopts [, int &$optind ]] ) : array..., 'V' = false, 'v' = 'vv', ) 上面例子短参数和长参数是对应,但是没有数据结构来表示他们对应关系(在C里面有option结构体来做这个对应关系管理),所以我们两个都传的话..., 'v' = 'vvV', ) 总结了这个GNU C command line options 使用套路,命令使用起来就更溜了,不会懵逼为什么linux下各种工具使用案例写法“千奇百怪”了。

50231
领券