我刚刚发现这getopt不是跨平台的(特别是对于FreeBSD和Linux).这个问题的最佳解决方法是什么?
有没有办法在一个Ruby程序中多次启动OptionParser,每个程序都有不同的选项?
例如:
$ myscript.rb --subsys1opt a --subsys2opt b
Run Code Online (Sandbox Code Playgroud)
在这里,myscript.rb将使用subsys1和subsys2,将它们的选项处理逻辑委托给它们,可能是首先处理'a'的序列,然后是单独的OptionParser对象中的'b'; 每次选择仅与该上下文相关的选项.最后阶段可以检查在每个部件处理完他们之后没有任何未知数.
用例是:
在松散耦合的前端程序中,各种组件具有不同的参数,我不希望'main'知道所有内容,只是为每个部分委派参数/选项集.
将一些更大的系统(如RSpec)嵌入到我的应用程序中,我只需通过命令行通过他们的选项,而不知道那些包装器.
我会用一些分隔符选项OK,以及像--或--vmargs在某些Java应用程序.
在Unix世界中有许多类似的东西的实际例子(startx/X,git plumbing和瓷器),其中一层处理一些选项但将其余部分传播到下层.
开箱即用,这似乎不起作用.每次OptionParse.parse!通话都会进行详尽的处理,对任何不知道的事情都会失败.我想我很乐意跳过未知选项.
任何提示,也许是替代方法都是受欢迎的.
我有一个程序,它接受多个命令行参数,所以我使用getopt.我的一个参数将字符串作为参数.无论如何通过getopt函数获取该字符串还是必须通过argv []数组获取它?也可以像getopt读取args一样-file吗?我到目前为止看到的所有论点只有一个如-a
编辑
从下面的答案中我编写了一个程序来使用getopt_long(),但是当我使用字符参数而不是long参数时,switch语句只识别参数.我不确定为什么会这样.在传递参数时,-mf -file sample我没有看到print语句.
编辑
我尝试输入命令参数--file,然后它工作.是不是可以这样做-file?
static struct option long_options[] =
{
{"mf", required_argument, NULL, 'a'},
{"md", required_argument, NULL, 'b'},
{"mn", required_argument, NULL, 'c'},
{"mw", required_argument, NULL, 'd'},
{"lf", required_argument, NULL, 'e'},
{"ld", required_argument, NULL, 'f'},
{"ln", required_argument, NULL, 'g'},
{"lw", required_argument, NULL, 'h'},
{"rf", required_argument, NULL, 'i'},
{"rd", required_argument, NULL, 'j'},
{"rn", required_argument, NULL, 'k'},
{"rw", required_argument, NULL, 'l'},
{"df", required_argument, NULL, 'm'},
{"dd", required_argument, NULL, 'n'},
{"dn", …Run Code Online (Sandbox Code Playgroud) 我试图在我的Perl脚本中使用Getopt :: Std从命令行收集值.
use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
getopts('i:o:p:');
my $inputfile = our $opt_i;
my $outputfile = our $opt_o;
my $parameter_value = our $opt_p;
Run Code Online (Sandbox Code Playgroud)
这里前两个变量($ inputfile,$ outputfile)是必需的,但最后一个变量($ parameter_value)是可选的,可以忽略.
我试图-p在命令行忽略该标志时默认将一些值设置为最后一个变量($ parameter_value).
我试过用这个:
my $parameter_value = our $opt_p || "20";
Run Code Online (Sandbox Code Playgroud)
在命令行中忽略-p标志时,它传递正确的值.但问题是当我从命令行提供一些值时(例如-p 58),相同的值20被传递给程序而不是我从命令行传递的58.
能否指出我在这里犯的错误,请你帮帮我吧?
谢谢.
这个问题是关于php中的getopt函数.我需要将两个参数传递给php脚本,如
php script.php -f filename -t filetype
Run Code Online (Sandbox Code Playgroud)
现在根据文件类型可以是u,c或s我需要做正确的操作.
我正在使用相同的开关盒:
这是我正在使用的代码:
// Get filename of input file when executing through command line.
$file = getopt("f:t:");
Run Code Online (Sandbox Code Playgroud)
Switch case应该比较我从命令行(u,c或i)传入的文件的类型,并相应地匹配它并进行操作.
switch("I am not sure what should go in there and this is wrong,Please advice")
{
case `Not sure`:
$p->ini();
break;
case `Not sure`:
$p->iniCon();
break;
case `Not sure`:
$p->iniImp();
break;
}
Run Code Online (Sandbox Code Playgroud)
请建议!!!
GetOptions(
"r|repo=s" => \$repo,
"R|list-repos" => \$list,
);
Run Code Online (Sandbox Code Playgroud)
当我用-r qwe选项调用此脚本时,$list更新为1,这不是我所期望的.
如何使GetOpt区分大小写?
我认为标题是自我解释的.我正在制作一个节目,我想知道我应该使用哪两个以及为什么.
GNU getopt和使用它的命令行工具允许交叉选项和参数,称为置换选项(参见http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using -Getopt).Perl的Getopt :: Long模块也支持这个(使用qw(:config gnu_getopt)).argparse似乎不支持(甚至提及)置换选项.
有许多与arg/opt命令相关的SO问题,但似乎没有人回答这个问题:argparse可以像getopt那样置换参数顺序吗?
用例是一个典型的命令行签名,如GNU sort:
sort [opts] [files]
Run Code Online (Sandbox Code Playgroud)
其中1)选项和文件被置换,以及2)文件列表可以包含零个或多个参数.
例如:
import argparse
p = argparse.ArgumentParser();
p.add_argument('files',nargs='*',default=['-']);
p.add_argument('-z',action='store_true')
p.parse_args(['-z','bar','foo']) # ok
p.parse_args(['bar','foo','-z']) # ok
p.parse_args(['bar','-z','foo']) # not okay
usage: ipython [-h] [-z] [files [files ...]]
Run Code Online (Sandbox Code Playgroud)
我试过了:
我想实现一些接近上面GNU排序原型的东西.我对可以为每个文件指定的标志不感兴趣(例如,-f file1 -f file2).
在ruby-doc.org 页面上, 我发现了以下有关命令行选项/参数解析(getopt库)的信息:
以POSIX定义的格式返回相应的错误消息.如果没有发生错误,则返回nil.
什么是POSIX定义的命令行错误消息格式?它是哪种POSIX标准?
编辑:
我必须澄清一下,在解析命令行参数/选项时,我对标准/推荐的错误消息感兴趣.
在下面的链接(答案)中,我发现只提到了getopt的这种错误格式:
"%s: illegal option -- %c\n", <program name>, <option character>
"%s: option requires an argument -- %c\n", <program name>, <option character>
Run Code Online (Sandbox Code Playgroud)
是这一切吗?