# コマンドライン引数の処理(optparse)

# Bash

Bash 組み込みの getopts
gnu コマンドの getopt

  • いろいろ出来そうだが、いろいろ頑張るならもう python とかでいいよねってなった頃

# Python

ArgumentParser を使う
OptionParser クラスを使う deprecated

getopt とか OptionParser はオプション引数のみ対象にしているが、
ArgumentParser はオプション引数も位置引数も扱えるので便利で良い

import argparse
parser = argparse.ArgumentParser()
# オプション引数
parser.add_argument('-v', action='store_true')
# 位置引数
parser.add_argument('basedate', nargs='?') # '?' は 0 or 1、'*' は可変、なのだと思う

args = parser.parse_args()
if args.basedate == None:
  ..
from optparse import OptionParser
parser.add_option('-f', '--file', dest='filename')
# または
# parser.add_option('-f', '--file', dest='filename', action="store", type="string", default="")

(option, args) = parser.parse_args()

print(option.filename) # => 引数で指定した名前

指定可能な書式

./a.py -f a.txt
./a.py -fa.txt
./a.py --file=a.txt
./a.py --file a.txt
項目 内容
option store で指定した名前のメンバをもつオブジェクト
args 名前なしの引数が配列で入る

| action | 動作 | 使いみち |
|:-|:-|
| store | 値つきの引数 | --file a.txt |
| store_true | 指定したら true に | --enable-xxmode |

その他

  • 型を指定すると、型チェックをしてくれる
  • 正規表現とかでのチェックもできたらなあって思ったけど、下のように自分でやれ方式のようだ
if options.a === 'xx':
  parser.error('a should be xx')

# Ruby

OptionParser クラスを使う

引数の処理 (OptionParser, optparse)

require 'optparse'
opt = OptionParser.new

opt.on('-a')            {|v| v1 = v }  # -a が指定された時に v は true
opt.on('-b filename')   {|v| v2 = v }  # v は指定した引数 (-b の直後の文字列)
opt.on('-c [message]')  {|v| v3 = v }  # 省略可能な引数
opt.on('-d, --del')     {|v| v4 = v }  # --xxx 形式も受け付ける
opt.on('--echo')        {|v| v5 = v }  # --xxx 形式も受け付ける
opt.on('--[no-]file')   {|v| v6 = v }  # --no-file と指定すると v は false
opt.on('--group[=gid]') {|v| v7 = v }  # --xxx 形式も引数を指定可能
opt.on('-i', 'あああ')  {|v| v8 = v }  # --help で出るメッセージを指定

begin
  opt.parse!(ARGV)  # ARGVを解釈
                    # ※ "!" をつけるとARGVから "-x" は取り除かれる)
rescue OptionParser::InvalidOption => e
  puts e.message    # 「invalid option: -t」のように出る
end

[ 📩 ご意見 ]