Извлечение имен файлов из аргументов командной строки с помощью Ruby - PullRequest
2 голосов
/ 06 апреля 2009

Я пытаюсь использовать optparse для разбора аргументов командной строки. Я бы хотел, чтобы моя программа принимала такие аргументы:

$ ./myscript.rb [options] filename

Я могу легко управлять [options] частью:

require 'optparse'

options = { :verbose => false, :type => :html }

opts = OptionParser.new do |opts|
  opts.on('-v', '--verbose') do
    options[:verbose] = true
  end
  opts.on('-t', '--type', [:html, :css]) do |type|
    options[:type] = type
  end
end
opts.parse!(ARGV)

Но как мне получить filename?

Я мог бы извлечь его вручную из ARGV, но должно быть лучшее решение, просто не могу понять, как

Ответы [ 3 ]

4 голосов
/ 06 апреля 2009

Метод parse возвращает необработанный ARGV. Так что в вашем примере он вернет массив из одного элемента с именем файла в нем.

1 голос
/ 30 июля 2009

Я не могу просто использовать ARGV.pop. Например когда последний аргумент "CSS" это может быть файлом или принадлежать Тип переключателя.

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

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

0 голосов
/ 06 апреля 2009

Я не думаю, что извлекать его перед отправкой в ​​OptionParser плохо, я думаю, что это имеет смысл. Я, наверное, говорю это, потому что никогда раньше не использовал OptionParser, ну да ладно.

require 'optparse'

file = ARGV.pop
opts = OptionParser.new do |opts|
  # ...
end
...