Как разобрать аргумент без имени с помощью optparse Ruby

мне нужно разобрать командную строку, как

  script.rb <mandatory filename> [options]

С optparse.

конечно, я могу написать пользовательский код для обработки имени файла, а затем передать ARGV для optparse, но, может быть, есть более простой способ сделать это?

EDIT: есть еще один хакерский способ проанализировать такую командную строку, и это pass ['--mandatory-filename'] + ARGV для optparse, затем обработайте .

5 ответов


первый parse! С optparse, затем сканируйте ARGV и поднимите, если ARGV пуст. Вот так:

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

обязательное имя файла не будет обрабатываться OptionParser и останется для вас в ARGV-если его там нет, просто поднимите вручную.


просто чтобы следить за тем, что сказал Юлик и Shadowfirebird: при разборе с OptionParser имейте в виду, что parse! и parse имеют разные функциональные возможности. Первый удалит каждый аргумент, который он понимает, из переданного массива, где последний оставит их. Это изменяет условия для определения наличия требуемого аргумента.


хотя это не относится к каждой ситуации, это часто хорошо, чтобы иметь возможность обрабатывать несколько файлов в одной командной строке, например:

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

Если файлы не предоставлены, появится сообщение справки с баннером использования и описанием опций. Если файлы присутствуют, они будут единственным, что осталось в АРГВЕ.


Я не уверен, что он был добавлен недавно, но ни один из предыдущих ответов не упоминает об этом optparse.parse вернет значение ARGV после удаления проанализированных параметров.

Если вы это сделаете:

rest = optparse.parse!

вы получите массив с заданным файлом/файлами (вместе с неизвестными параметрами). Таким образом, вам не нужно беспокоиться, если параметры приходят до или после файла.


Optparse делает только аргументы с параметрами, AFAIK. "Правильный" способ обработки вашего имени файла-это иметь дело с ним за пределами optparse. Я опубликовал пример кода для этого в ответ на этой вопрос.

кстати, это довольно необычная командная строка. Если это только для вас, хорошо, но другие, вероятно, найдут это довольно противоречивым. Было бы более нормально иметь:script.rb [options] <filename>...