首页
学习
活动
专区
工具
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()的所有功能,只是增加了对长选项的支持,长选项使用两个破折号–表示。

4.4K71

getopt解析

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

69610
  • 深入理解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.6K10

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

    大家好,又见面了,我是你们的朋友全栈君。 前言 在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?...通常使用GNU C提供的函数getopt、getopt_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.6K30

    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

    41530

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

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

    59130

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

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

    11.1K90

    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); 发布者:

    2K51

    getopt 可能重排参数

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

    46330

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

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

    1.1K10

    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

    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 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。

    56400

    你还不知道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.3K20

    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

    参数解析工具 getopts 与 getopt 的对比

    对比分析 getopts 和getopt 都是 Unix/Linux 系统中用于解析命令行选项的工具,但它们之间有一些关键的不同点: 1....•getopt 更加复杂和灵活,它可以处理复杂的命令行选项组合,包括长选项、分组选项、带等号的选项值(如--output=file.txt),以及更多高级特性。 3....错误处理 •getopts 在遇到未知选项或缺少选项参数时会自动输出错误信息到标准错误流,并返回一个错误状态,这使得在脚本中处理这些情况变得容易。•getopt 的错误处理机制依赖于你如何调用它。...脚本测试输出如下: 使用getopt 的例子参考前文 如何在Bash中解析命令行参数? 末尾的脚本 myscript。...综上所述,如果你的需求较为简单,推荐使用getopts,因为它更简单易用;如果需要更复杂的功能,比如长选项或参数重排序,则应该考虑使用getopt。

    14110

    getopts(1) builtin command

    Shell 脚本中可以通过1...N形式的符号来引用传入的参数,0表示当前脚本的名称。1~N 和传入参数位置相对应,比如1表示执行脚本时传入的第一个参数,2表示传入的第二个参数,以此类推引用其他参数。...getopts 是一个简化版的 getopt,出现的目的仅仅是为了代替 getopt 较快捷方便的执行参数分析。 getopts 语法相对简单,不支持长选项(以 -- 开头的长选项,如--help)。...5.特殊变量 getopts 的使用涉及一些特殊变量。 OPTARG OPTARG 存储当前选项的参数值。如果选项需要一个参数,getopts 会将该参数存储在 OPTARG 中。...OPTIND OPTIND 是 getopts 内建变量,用于表示下一个要处理的参数的索引位置,从 1 开始。getopts 处理选项时会自动更新 OPTIND。...OPTIND 可用于检查和处理未解析的命令行参数。例如shift $((OPTIND -1))可以跳过已处理的选项,处理剩余的参数。

    14610
    领券