Как разобрать аргумент без имени с optparse Руби - PullRequest
29 голосов
/ 15 марта 2010

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

  script.rb <mandatory filename> [options]

с optparse .

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

РЕДАКТИРОВАТЬ: есть еще один хакерский способ разобрать такую ​​командную строку, это передать ['--mandatory-filename'] + ARGV в optparse, а затем обработать опцию --mandatory-filename.

Ответы [ 5 ]

45 голосов
/ 15 марта 2010

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

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

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

9 голосов
/ 06 апреля 2010

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

5 голосов
/ 06 апреля 2011

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

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.

2 голосов
/ 06 мая 2016

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

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

rest = optparse.parse!

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

0 голосов
/ 16 марта 2010

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

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

...