[Ruby] ruby で ARGV をうけるコマンドっぽいものを作ってみる

memo.

ARGV をうけとってコマンドっぽく動かす

キチンと書くとどうなるのかググってみた所、下記の書籍のコードを見つけました。

Rubyアプリケーションプログラミング
前田 修吾 まつもと ゆきひろ やまだ あきら 永井 秀利
オーム社
売り上げランキング: 106,912

以前の知識を元に、行頭にパスを付けて chmod +x してみる。

argv_cmd.rb
#!/usr/bin/ruby
if ARGV.size < 2
  STDERR.print "Usage: ruby#{$0} user_name password [server]\n"
  exit
end
puts user_name = ARGV[0]
puts password  = ARGV[1]
puts server    = if ARGV[2] then ARGV[2] else 'localhost' end
% chmod +x argv_cmd.rb

実行してみる。

% ./argv_cmd.rb bob tatata iris
bob
tatata
iris

optparse をつかって -a のようなコマンドラインオプションをつかう

OptionParser を使うとよいことが分かったので、さらに調べてみる。

#!/usr/bin/ruby
require 'optparse'
parser = OptionParser.new
parser.version = '0.0.1'
parser.on('-u user', '--user') {|v| OPTS[:u] = v}
parser.on('-p password', '--password') {|v| OPTS[:p] = v}
parser.on('-s [server]', '--server') {|v| OPTS[:s] = v}
parser.parse!(ARGV)
p ARGV[0]
p OPTS

実行。

% ./argv_cmd.rb -s iris -u bob -p tatata filename
"filename"
{:s=>"iris", :u=>"bob", :p=>"tatata"}

さらにディフォルトで、--help--version に対応しているとのこと。

% ./argv_cmd.rb --help
Usage: argv_cmd [options]
    -u, --user user
    -p, --password password
    -s, --server [server]
% ./argv_cmd.rb --version
argv_cmd 0.0.1

おぉ!!

ARGV.getopts をつかう

と手軽に書けるよう。初期値もかけた。

#!/usr/bin/ruby
require 'optparse'
OPTS = ARGV.getopts('', 'user:', 'password:', 'server:localhost')
p ARGV[0]
p OPTS

実行。

% ./argv_cmd.rb -s iris -u bob -p tatata filename
"filename"
{"user"=>"bob", "password"=>"tatata", "server"=>"iris"}
% ./argv_cmd.rb --help
Usage: argv_cmd [options]
        --user VAL
        --password VAL
        --server VAL

エラー時にヘルプを表示する

こちらを参考に、エラーを拾ったらヘルプを表示するよう処理。

OPTS = {}
OptionParser.new do |opt|
  begin
    opt.version = '0.0.1'
    opt.on('-u VAL', '--user', 'user') {|v| OPTS[:u] = v}
    opt.on('-p VAL', '--password', 'password') {|v| OPTS[:p] = v}
    opt.on('-s [VAL]', '--server', 'server name') {|v| OPTS[:s] = v}
    opt.on('-h','--help','show this message') {puts opt; exit}
    opt.parse!(ARGV)
  rescue => e
    puts "ERROR: #{e}.\nSee #{opt}"
    exit
  end
end

ヘルプの見栄えを整える

いろいろがんばってみる。

% ./argv_cmd.rb --help
Usage: argv_cmd.rb [options] file.csv
Examples:
    % argv_cmd.rb -u foo -p bar -s buzz file.csv
Specific options:
    -u, --user USER                  user
    -p, --password PASSWORD          password
    -s, --server SERVER              server
Common options:
    -h, --help                       show this help message and exit
    -v, --version                    show program's version number and exit

ぽい感じになった!

補遺