harry’s memorandum

おれおれメモ

optparse の使い方

optparseとは?

コマンドラインのオプション解析をするものです。
C++とかperlとかShellなどにある、コマンドオプション解析の getopt、それのruby*1です。
チュートリアルが非常にわかりやすい。
http://www.ruby-lang.org/ja/man/html/optparse_A5C1A5E5A1BCA5C8A5EAA5A2A5EB.html

チュートリアルより。

  1. OptionParser オブジェクト opt を生成する。
  2. オプションを取り扱うブロックを opt に登録する。
  3. 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
}

*1:rubyにもgetoptsあるけど、1.8系では推奨しないそうです。