在C中,getopt_long不会解析命令行参数参数的可选参数.
当我运行程序时,无法识别可选参数,如下面的示例运行.
$ ./respond --praise John
Kudos to John
$ ./respond --blame John
You suck !
$ ./respond --blame
You suck !
Run Code Online (Sandbox Code Playgroud)
这是测试代码.
#include <stdio.h>
#include <getopt.h>
int main(int argc, char ** argv )
{
int getopt_ret, option_index;
static struct option long_options[] = {
{"praise", required_argument, 0, 'p'},
{"blame", optional_argument, 0, 'b'},
{0, 0, 0, 0} };
while (1) {
getopt_ret = getopt_long( argc, argv, "p:b::",
long_options, &option_index);
if (getopt_ret == -1) break;
switch(getopt_ret)
{
case 0: break;
case 'p': …Run Code Online (Sandbox Code Playgroud) 我想在bash脚本中支持短期和长期选项,因此可以:
$ foo -ax --long-key val -b -y SOME FILE NAMES
Run Code Online (Sandbox Code Playgroud)
可能吗?
如果我有一个命令行,如:
my_script.pl -foo -WHATEVER
Run Code Online (Sandbox Code Playgroud)
我的脚本知道--foo,我希望Getopt设置变量$opt_foo,但我不知道任何事情-WHATEVER.我如何告诉Getopt解析我告诉它的选项,然后在字符串变量或列表中获取其余参数?
一个例子:
use strict;
use warnings;
use Getopt::Long;
my $foo;
GetOptions('foo' => \$foo);
print 'remaining options: ', @ARGV;
Run Code Online (Sandbox Code Playgroud)
然后,发行
perl getopttest.pl -foo -WHATEVER
给
Unknown option: whatever remaining options:
当遇到getopt或getopt_long遇到非法选项时,它会存储违规选项字符optopt.当非法选项是一个很长的选项时,我在哪里可以找到该选项是什么?然后有什么有意义的存储optopt吗?
我已设置opterr = 0禁止自动打印的错误消息.我想创建自己的消息,我可以打印或记录我想要的地方,但我想要包含无法识别的选项的名称.
我正在C中创建一个处理大量命令行参数的小程序,所以我决定使用getopt为我排序.
但是,我希望两个非选项参数(源文件和目标文件)是必需的,因此在调用程序时必须将它们作为参数,即使没有标志或其他参数.
这是我用标志处理参数的简化版本:
while ((c = getopt(argc, argv, "i:d:btw:h:s:")) != -1) {
switch (c) {
case 'i': {
i = (int)atol(optarg);
}
case 'd': {
d = (int)atol(optarg);
}
case 'b':
buf = 1;
break;
case 't':
time = 1;
break;
case 'w':
w = (int)atol(optarg);
break;
case 'h':
h = (int)atol(optarg);
break;
case 's':
s = (int)atol(optarg);
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如何编辑它以便还处理非选项参数?
我还希望能够在选项之前或之后获得非选项,那么如何处理呢?
我正在开发一个现有程序的更新.我正在用boost :: program_options替换Posix的getopt_long().但是我的工作并没有像我应该的那样工作:我希望阅读如下的论点:
-server=www.example.com
-c config.txt
Run Code Online (Sandbox Code Playgroud)
我尝试了boost :: program_options :: command_line_style的许多可能性,但是我找不到能够使行为等于getopt_long的组合.
我发现了这个论点:
-server=www.example.com
Run Code Online (Sandbox Code Playgroud)
我需要旗帜:
command_line_style::allow_long_disguise | command_line_style::long_allow_adjacent
Run Code Online (Sandbox Code Playgroud)
但我有建立标志的问题:
-c config.txt
Run Code Online (Sandbox Code Playgroud)
我找到了旗帜:
command_line_style::allow_short | command_line_style::allow_dash_for_short | command_line_style::short_allow_next
Run Code Online (Sandbox Code Playgroud)
给我几乎我想要的东西.几乎是因为:
ProgramOptionsParserTest.cpp:107: Failure
Value of: params.config
Actual: " config.txt"
Expected: expectedParams.config
Which is: "config.txt"
Run Code Online (Sandbox Code Playgroud)
所以在使用boost :: algorithm :: trim()后,它将是我想要的.
所以我的问题是:是否可以使用boost :: program_options处理像-c config.txt这样的参数但没有boost :: algorithm :: trim()?
编辑 我注意到上面的标志不适用于未注册的参数.我有注册选项:
programOptionsDescription.add_options()
("help,h", "display help message")
("config,c", value<std::string>(), "use configfile")
("server,s", value<std::string>(), "server")
("ipport,p", value<uint16_t>(), "server port");
Run Code Online (Sandbox Code Playgroud)
但是当我使用未注册的选项时(是的,我有basic_command_line_parser :: allow_unregistered()):
-calibration=something
Run Code Online (Sandbox Code Playgroud)
我知道了:
the argument ('alibration=something') for …Run Code Online (Sandbox Code Playgroud) 我刚刚在代码审查中被要求检查调用Perl模块GetOptions()函数的返回代码Getopt::Long.
我不记得曾见过这样的GetOptions()功能测试.
那么人们通常不会检查此函数的返回码是否有特定的原因?
我有一个带有可能的命令行参数的字符串(使用Read-Eval-Print-Loop程序),我希望它在传递给Getopt :: Long时被解析为类似于命令行参数.
详细说明:
我有一个字符串
$str = '--infile /tmp/infile_location --outfile /tmp/outfile'
Run Code Online (Sandbox Code Playgroud)
我希望它被GetOptions解析,以便我更容易添加新选项.
我能想到的一个解决方法是将字符串拆分为空格,并用新数组替换@ARGV,然后调用GetOptions.就像是 ...
my @arg_arr = split (/\s/, $input_line);
# This is done so that GetOptions reads these new arguments
@ARGV = @arg_arr;
print "ARGV is : @ARGV\n";
GetOptions (
'infile=s' => \$infile,
'outfile=s' => \$outfile
);
Run Code Online (Sandbox Code Playgroud)
有没有好/更好的方法?
使用在C++程序中,Eclipse CDT标记getopt_long为"无法解析".代码使用g ++ program.cpp编译并运行良好.这与Eclipse构建设置有关吗?
是否可以关闭缩写getopt_long()?从手册页:
如果缩写是唯一的或者与某些定义的选项完全匹配,则可以缩写长选项名称。
我想这样做是因为我收到的一段代码的规范要求标志的全长精确匹配,并且有很多标志。