2015-04-28 43 views
0

我正在使用命令行搜索工具,它使用给定的关键字搜索源文件。我使用optparse来解析命令行选项。对于现在这个样子:如何使用optparse获取命令行参数?

qs -p ~/Desktop/project -k line

如果没有提供-p说法我使用默认值(当前)目录:

qs -k line

但是,我真正希望做的一样但没有-k,如下所示:

qs line

现在我有这样的:

OptionParser.new do |options| 

    options.banner = "Usage: qs [options] [path] [keyword]\n" \ 
        "\nSearch through files for a given keyword at specified path.\n" \ 
        "If path is no specified current directory used by default." 

    options.separator "" 
    options.separator "Specific options:" 

    options.on("--no-rec", "Looking in files only at that level.") do |r| 
    $values[:recursion] = r 
    end 

    options.on('-p', '--path PATH', String, 'Path where to start search') do |path| 
    $values[:path] = path 
    end 

    options.on('-k', '--key WORD', String, 'Word you are looking for ') do |key| 
    $values[:keyword] = key 
    end  

    options.on_tail("-h" , "--help", "Help documentation.") do 
    $stderr.puts options 
    exit 1 
    end 
end.parse! 

正如你可以看到它是不可能做这样的事情:

$values[:keyword] = ARGV[2]

因为不能保证所有的参数将出席会议。

是否可以这样做,而不会丢失optparse的所有支持?

在此先感谢。

回答

1

当您使用parse!(与!),Optparse去除ARGV的选项,所以后来其他任何物品(即Optparse不承认)将在ARGV[0]起。

所以,你应该能够做这样的事情:

OptionParser.new do |options| 
    # as before, but without k option 
end.parse! 

# At this point all the options optparse knows about will be 
# removed from ARGV, so you can get at what's left: 
$values[:keyword] = ARGV[0] 
相关问题