37

次のようなコマンドラインを解析する必要があります

  script.rb <mandatory filename> [options]

optparseを使用します。

確かに、ファイル名を処理するカスタムコードを記述してARGVから、optparseに渡すことはできますが、もっと簡単な方法があるのではないでしょうか。

編集:そのようなコマンドラインを解析する別のハッキーな方法があります。['--mandatory-filename'] + ARGVそれはoptparseに渡され、--mandatory-filenameオプションを処理します。

4

5 に答える 5

52

最初parse!にoptparseを使用し、次にARGVをスキャンして、ARGVが空の場合はレイズします。そのようです:

op.parse!
filename = ARGV.pop
raise "Need to specify a file to process" unless filename

必須のファイル名はによって処理されずOptionParser、ARGVに残されます。ファイル名がない場合は、手動でレイズしてください。

于 2010-03-15T18:21:48.473 に答える
12

JulikとShadowfirebirdが言ったことをフォローアップするためだけに:構文解析するときは、OptionParserそれに注意してparse!parse異なる機能を使用してください。前者は、渡された配列から理解できるすべての引数を削除し、後者はそれらを残します。これにより、必要な引数が存在するかどうかを判断するための条件が変更されます。

于 2010-04-06T19:25:52.223 に答える
9

すべての状況に当てはまるわけではありませんが、次のように1つのコマンドラインで複数のファイルを処理できると便利なことがよくあります。

script.rb [options] file1 file2 ...

file1は必須ですが、file2以降はオプションです。

これを行うために私が知っている最善の方法は、次の規則に従います。

options = {}
optparse = OptionParser.new do |opts|
  opts.banner = "Usage: script.rb [options] file1 file2 ..."

  opts.on('-a', '--an-option ARG', 'Set some option') do |arg|
    options[:a] = arg
  end

  ...
end
optparse.parse!

# Check required conditions
if ARGV.empty?
  puts optparse
  exit(-1)
end

ファイルが提供されていない場合は、使用状況バナーとオプションの説明を含むヘルプメッセージが表示されます。ファイルが存在する場合、ARGVに残っているのはそれらだけです。

于 2011-04-06T03:18:46.130 に答える
2

最近追加されたかどうかはわかりませんがoptparse.parse、解析されたオプションを削除した後にARGV値を返すという以前の回答はありません。

これを行う場合:

rest = optparse.parse!

指定されたファイルを含む配列を取得します(不明なオプションとともに)。このように、オプションがファイルの前にあるか後にあるかを気にする必要はありません。

于 2016-05-06T16:09:24.163 に答える
0

Optparseは、パラメータAFAIKを使用した引数のみを実行します。ファイル名を処理する「正しい」方法は、optparseの外部でファイル名を処理することです。この質問に答えるために、このためのサンプルコードをいくつか投稿しました。

ところで、それはかなり珍しいコマンドラインです。それがあなただけのものであれば、問題ありませんが、他の人はそれがかなり直感に反していると感じる可能性があります。持っているのがより普通でしょう:script.rb [options] <filename>..。

于 2010-03-15T21:19:19.017 に答える