Ruby OptionParser

Ruby OptionParser를 정리한다.

Posted by BELLSTONE on October 28, 2019 · 8 mins read

1. Ruby OptionParser

  • Ruby OptionParser를 참고하여 작성하였습니다.

  • OptionParser는 터미널 등의 커맨드 창에서 입력받은 옵션을 분석하기 위한 클래스입니다.

  • OptionParser를 사용하여, 실행할 때 필요한 옵션들을 지정할 수 있으며, 요약도 표현할 수 있습니다!

2. Ruby OptionParser 사용법

1
require 'optparse'
  • 상단에 require를 입력하여 OptionParser 모듈을 호출합니다.

  • Ruby에서 스크립트에 주어진 인수를 ARGV를 통해 배열로 받을 수 있습니다.

1
2
$ test.rb test
// ["test"]
  • 먼저 예시의 소스 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require 'optparse'

# Default values
options = {
  str: '',
  int: 0,
  boolean: false,
  enum: '',
  array: {}
}

OptionParser.new do |opts|
  opts.banner = 'Usage: test.rb [options]'

  opts.on_head('   Options                               Description')
  opts.on('-s', '--string str_value', 'String type  (Default : \'\')') { |v| options[:str] = v}
  opts.on('-i', '--i int_value', Integer, 'Integer type (Default : 0)'){ |v| options[:int] = v}
  opts.on('-b', '--[no-]boolean', 'Boolean type(Default : false)'){ |v| options[:boolean] = v}
  opts.on('-a', '--a array first, second', Array, 'Array type   (Default : {})') { |v| options[:array] = v}
  opts.on('-e', '--e enum', [:a, :b, :c], 'Enum values') { |v| options[:enum] = v}
end.parse!

p options
p ARGV

1) –help

  • -h 또는 --help를 입력하면, 옵션에 대한 설명이 자동 생성되어 console에 나타납니다.

  • banner를 설정하여 옵션 출력 전 최상단에 간단한 배너를 출력할 수 있습니다.

  • on_head를 설정하여 옵션 설명을 추가할 수 있습니다.

1
$ test.rb --help
  • 위의 커맨드를 입력하여, 예시 코드에 설정된 옵션들을 출력해보겠습니다.
1
2
3
4
5
6
7
Usage: test.rb [options]
   Options                               Description
    -s, --string str_value              String type  (Default : '')
    -i, --i int_value                 Integer type (Default : 0)
    -b, --[no-]boolean               Boolean type(Default : false)
    -a, --a array first, second      Array type   (Default : {})
    -e, --e enum                     Enum values

2) 옵션 추가

  • on을 사용하여 옵션을 추가할 수 있습니다.

① 문자열

1
  opts.on('-s', '--string str_value', 'String type  (Default : \'\')') { |v| options[:str] = v}
  • 기본적으로 옵션의 인수를 문자열로 받기 때문에, 따로 타입을 설정할 필요는 없습니다.

  • str_value는 옵션 뒤의 변수를 받기 위한 것이므로, 다른 이름을 사용하셔도 괜찮습니다.

    • 만약, 변경하시면 --help 입력 후 해당 변수의 이름이 변경됩니다.

② 숫자

1
opts.on('-i', '--i int_value', Integer, 'Integer type (Default : 0)'){ |v| options[:int] = v}
  • Integer를 입력하여, Type을 강제할 수 있습니다.

  • Date, DateTime, Time, URI 등 다른 지원하는 타입들은 Docs를 참고해주세요

③ Boolean

1
opts.on('-b', '--[no-]boolean', 'Boolean type(Default : false)'){ |v| options[:boolean] = v}
  • 인수를 사용하지 않고 값만 필요한 경우에는 boolean을 이용할 수 있습니다.

  • default 값에 false를 지정해놓았지만, 옵션에 -b를 입력한다면 true로 표시됩니다.

  • 옵션에 --no-boolean을 입력하시면, false로 표시됩니다.

④ 배열

1
opts.on('-a', '--a array first, second', Array, 'Array type   (Default : {})') { |v| options[:array] = v}
  • TypeArray로 지정하면 ,(컴마)를 이용하여 구분할 수 있습니다.
1
$ test -a bell,stone,blog # {:array=>["bell", "stone", "blog"]}
  • 위와 같이 옵션에 -a를 입력하고 test -a bell,stone,blog를 입력하면 배열의 형태로 입력됩니다.

⑤ Enum

1
  opts.on('-e', '--e enum', [:first, :second, :third], 'Enum values') { |v| options[:enum] = v}
  • Enum을 사용하여, 입력받는 인수를 제한할 수 있습니다.

  • 지정되어있는 first, second, third 이외의 것을 입력하면, InvalidArgument 에러가 발생합니다.

테스트 결과

1
$ test -s optionparser -i 20191028 -b -a bellstone,blog -e first Hello OptionParser
  • 잘 작동하는지 확인하기 위해 Console에 입력해봅니다.
1
2
{:str=>"optionparser", :int=>20191028, :boolean=>true, :enum=>:first, :array=>["bellstone", "blog"]}
["Hello", "OptionParser"]
  • 그럼 끝!

참고