Ruby optparser中不必要的争论

时间:2017-12-06 07:01:39

标签: ruby command-line-interface optparse

我遇到以下用于解析命令行选项的代码

的问题
#!/usr/bin/env ruby
require 'optparse'

options = {:username=>nil}
optparse = OptionParser.new do|opts|
    # Define the options, and what they d
    opts.on( "--username", "Cassandra username" ) do |username|
        options[:username] = username
    end

    opts.on( '--password', 'Cassandra password' ) do |password|
        options[:password] = password
    end

    opts.on( '--keyspace', 'Cassandra keyspace' ) do |keyspace|
        options[:keyspace] = keyspace
    end
end
puts ARGV

optparse.parse!(ARGV)

puts options

当我从命令行运行此代码时

./testopt.rb --username=uuuuu --password=xxxxxx --keyspace=test

我得到以下输出

--username=uuuuu
--password=xxxxxx
--keyspace=test
./testopt.rb:25:in `<main>': needless argument: --username=uuuuu (OptionParser::NeedlessArgument)

缺少什么? 我在ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

提前致谢

2 个答案:

答案 0 :(得分:2)

虽然@mudasobwas answer本身并没有错,但您可以通过指定以下示例中的选项进行"option=value"解析(mmh,仅使用ruby 2.3.1进行测试 )。

关键是使用opts.on('--username=USER',...opts.on('--username',...

#!/usr/bin/env ruby
require 'optparse'

options = {:username=>nil}
optparse = OptionParser.new do|opts|
    # Define the options, and what they do
    opts.on( "--username=USER", 'Cassandra username' ) do |username|
        options[:username] = username
    end

    opts.on( '--password=PASSWORD', 'Cassandra password' ) do |password|
        options[:password] = password
    end

    opts.on( '--keyspace=KEY', 'Cassandra keyspace' ) do |keyspace|
        options[:keyspace] = keyspace
    end
end
puts ARGV

optparse.parse!(ARGV)

puts options

使用此方法,如果没有等号,则不会失去传递值的能力,并将其转换为字符串:

➜  ~  /tmp/op.rb --username myuser           
--username
myuser
{:username=>"myuser"}
➜  ~  /tmp/op.rb --username=myuser
--username=myuser
{:username=>"myuser"}

答案 1 :(得分:0)

删除等号。 OptParser期望arg名称和args之间的空格:

./testopt.rb --username uuuuu --password xxxxxx --keyspace test