C 在检查选项之前处理getopt中的非选项参数
我正在编写一个程序,我想在检查标志之前获取非选项参数 例如,如果参数是C 在检查选项之前处理getopt中的非选项参数,c,unix,getopt,C,Unix,Getopt,我正在编写一个程序,我想在检查标志之前获取非选项参数 例如,如果参数是/a.out-a-b 50 filename 我想使用filename,然后根据标志执行task\u a()和/或task\u b()filename可以是argv[]中的任何参数 int opt; float value; while ((opt = getopt(argc, argv, "ab:")) != -1) case 'a': task_a(filename);
/a.out-a-b 50 filename
我想使用filename
,然后根据标志执行task\u a()
和/或task\u b()
filename
可以是argv[]中的任何参数
int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1)
case 'a':
task_a(filename);
break;
case 'b':
value = atof(optarg);
task_b(filename, value);
break;
所以基本上我需要先提取
文件名
,然后才能在任务中使用它。如何实现这一点?getopt将按照在命令行中找到命令行参数的顺序向您传递这些参数。这通常不是您想要处理它们的顺序
相反,在执行操作之前,让您的程序先设置其选项-例如(给定#include):
我选择了“亮度”这个名字作为一个有意义的属性名称——当然你应该自己选择。作为良好的实践,不要将变量命名为“optionA”或类似的名称——变量名称应该描述它们是什么,而不是具体的实现细节
始终想象您的选项可以随着时间的推移而更改字母(现在的选项“a”可能在六个月后变成选项“R”)——这种更改不应该影响任何东西,除了“getopt”参数和“case”语句
编辑以更改:
我最初用“IF(亮度>0)”来写这个问题,但通常认为一个单独的dotaskb变量是更干净、更明确的方法,它不限制参数的可能值。如果你在Linux上,考虑阅读它,特别是它的部分,谢谢你的回应。我理解这一点,但我的要求也延伸到这样一个事实:任务应该按照
argv
中给出的参数的顺序完成。另外,根据任务的数量,可能需要完成大约10项任务flags@Wind_Fire很乐意帮忙。不管有什么要求,我总是将命令行的解析与执行其任务的程序分离开来。它们是程序执行的两个不同阶段——1)找出用户想要做什么,然后2)执行。不要把它们混在一起。因此,第一阶段的输出是一个结构,详细说明了程序要做的一切,以及要用什么来做。所以如果秩序很重要,那么秩序应该在这个结构中。它确实会带来好处,因为更清晰、更明确的代码在将来需求发生变化时易于维护。
// Set the defaults
bool doTaskA = false;
book doTaskB = false;
float brightness = -1;
int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1) {
case 'a':
doTaskA = true;
break;
case 'b':
doTaskB = true;
brightness = atof(optarg);
break;
}
filename = ....,,
if (doTaskA) {
task_a(filename);
}
if (doTaskB) {
task_b(filename, brightness);
}