optparse::チュートリアル

OptionParser

optparse を使う場合、基本的には

  1. OptionParser オブジェクト opt を生成する。
  2. オプションを取り扱うブロックを opt に登録する。
  3. opt.parse(ARGV) でコマンドラインを実際に parse する。

というような流れになります。

オプションの定義

別の書き方

OprionParser.new はブロックを受け付ける。ブロックの引数は生成した インスタンスなので、以下の書き方ができる。

require 'optparse'
OptionParser.new {|opt|

  opt.on('-a') {|v| p v }
  opt.on('-b') {|v| p v }

  opt.parse!(ARGV)
}
p ARGV

この書き方の利点は、

ぐらいか?

ARGV の機能

optparse.rb を require すると、ARGV に OptionParser::Arguable の機能 が加わる。このことにより、以下の書き方ができるようになる。

require 'optparse'
ARGV.options {|opt|

    opt.on('-a') {|v| p v }
    opt.on('-b') {|v| p v }

    opt.parse!
}
p ARGV

ruby sample.rb -a foo bar -b baz
# => true
     true
     ["foo", "bar", "baz"]

別の書き方で示した例に比べて、

といった違いがある。

特に利点があるわけではないが、optparse 添付のサンプルはこの書 き方になっている。

オプションの引数

ロングオプション

ヘルプ

サブコマンド

以下は cvs や svn のようにサブコマンドを解釈する例である。

#! /usr/bin/ruby
# contributed by Minero Aoki.

require 'optparse'

parser = OptionParser.new
parser.on('-i') { puts "-i" }
parser.on('-o') { puts '-o' }

subparsers = Hash.new {|h,k|
  $stderr.puts "no such subcommand: #{k}"
  exit 1
}
subparsers['add'] = OptionParser.new.on('-i') { puts "add -i" }
subparsers['del'] = OptionParser.new.on('-i') { puts "del -i" }
subparsers['list'] = OptionParser.new.on('-i') { puts "list -i" }

parser.order!(ARGV)
subparsers[ARGV.shift].parse!(ARGV) unless ARGV.empty?

実行すると以下のようになる。

$ ruby subcom.rb -i add -i
-i
add -i

$ ruby subcom.rb list -i
list -i

OptionParser#order! がオプションではない コマンドの引数に出会うとそこでパースを中断することを利用している。

'-'で始まるファイル名

'-'で始まるファイル名をコマンドに渡したい場合は以下のように間に"--"を挟む。

$ ruby sample.rb -- -a 

"-a" がオプションではない引数として解釈される。 これは POSIX.2 の getopt(3) に由来する。"--" 以降はすべてオプションではない引数として解釈される。



rubyist ML