optparse の使い方
optparseとは?
コマンドラインのオプション解析をするものです。
C++とかperlとかShellなどにある、コマンドオプション解析の getopt、それのruby版*1です。
チュートリアルが非常にわかりやすい。
http://www.ruby-lang.org/ja/man/html/optparse_A5C1A5E5A1BCA5C8A5EAA5A2A5EB.html
チュートリアルより。
- OptionParser オブジェクト opt を生成する。
- オプションを取り扱うブロックを opt に登録する。
- opt.parse(ARGV) でコマンドラインを実際に parse する。
したのは-aと-bを解析します。無いオプションを引数に指定すると、例外になります。
require 'optparse' opt = OptionParser.new opt.on('-a') {|v| p v } opt.on('-b') {|v| p v } opt.parse!(ARGV) p ARGV ruby sample.rb -a foo bar -b baz # => true true ["foo", "bar", "baz"]
Rubyチュートリアル::はじめの一歩 - grep に optparse を追加してみた。
#!/usr/bin/ruby require 'optparse' opt = OptionParser.new def usage puts "#{__FILE__} [-cinv] [pattern] [file...]"; exit end o = Hash.new begin opt.on('-c') {|v| o[:c] = v } opt.on('-i') {|v| o[:i] = v } opt.on('-n') {|v| o[:n] = v } opt.on('-v') {|v| o[:v] = v } opt.parse!(ARGV) rescue puts "#{__FILE__}: unrecognized option \`#{ARGV[0]} \'" exit end usage if ARGV.size < 2 o[:i] == true ? pat = /#{ARGV.shift}/i : pat = /#{ARGV.shift}/ ARGV.each {|file| FileTest.file?(file) ? st = open(file) : (puts "Not such file or directory: #{file}"; next) if o[:c] && o[:v] c = 0; st.each {|l| c += 1 unless pat =~ l } puts #{file}:#{c}" elsif o[:c] c = 0; st.each {|l| c += 1 if pat =~ l } puts "#{file}:#{c}" elsif o[:n] && o[:v] c = 0; st.each {|l| c += 1; puts "#{file}:#{c}:#{l}" unless pat =~ l } elsif o[:n] c = 0; st.each {|l| c += 1; puts "#{file}:#{c}:#{l}" if pat =~ l } else st.each {|l| puts "#{file}:#{l}" if pat =~ l } end }