Как анализировать аргумент без имени с помощью Ruby optparse
Мне нужно проанализировать командную строку, например
script.rb <mandatory filename> [options]
с optparse.
Конечно, я могу написать какой-то пользовательский код для обработки имени файла, а затем передать ARGV
, чтобы optparse, но, возможно, есть более простой способ сделать это?
EDIT: существует еще один хакерский способ разобрать такую командную строку, и это передать ['--mandatory-filename'] + ARGV
, чтобы optparse, а затем обработать параметр --mandatory-filename
.
Ответы
Ответ 1
Сначала parse!
с optparse, затем сканируйте ARGV и поднимите, если ARGV пуст. Например:
op.parse!
filename = ARGV.pop
raise "Need to specify a file to process" unless filename
Обязательное имя файла не будет обрабатываться OptionParser
и останется для вас в ARGV - если оно там отсутствует, просто поднимите вручную.
Ответ 2
Просто для того, чтобы следить за тем, что сказал Джулик и Тень Firefirebird: Когда синтаксический анализ с OptionParser
должен знать, что parse!
и parse
имеют разную функциональность. Первый будет удалять все аргументы, которые он понимает из переданного массива, где последний оставит их. Это изменяет ваши условия для определения наличия требуемого аргумента.
Ответ 3
Хотя это не относится ко всем ситуациям, часто бывает полезно обрабатывать несколько файлов в одной командной строке, например:
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.
Ответ 4
Я не уверен, добавлен ли он недавно, но ни один из предыдущих ответов не упоминает, что optparse.parse
вернет значение ARGV после удаления проанализированных опций.
Если вы это сделаете:
rest = optparse.parse!
Вы получите массив с заданным файлом /s (по неизвестным параметрам). Таким образом, вам не нужно заботиться о том, будут ли параметры доступны до или после файла.
Ответ 5
Optparse использует аргументы с параметрами AFAIK. "Правильный" способ обработки вашего имени файла - иметь дело с ним вне optparse. Я отправил код примера для этого в ответ на этот вопрос.
Кстати, это довольно необычная командная строка. Если это только для вас, отлично, но другие, скорее всего, найдут его скорее противоречащим интуиции. Было бы более нормальным иметь: script.rb [options] <filename>
...