Для парсинга аргументов коммандной строки я обычно использовал библиотеку GetOpt. Это достаточно неудобная библиотека и я был счастлив случайно наткнувшись на Docopt.
Начало.
Начать использовать ее достаточно просто: для того чтобы научить ваш скрипт парсить строку вывода сначала надо подключить библиотеку:
require 'docopt'
И после этого можно попробовать инициализировать переменную и присвоить ей соответствующее значение.
doc =<<EOF Usage: #{__FILE__} add <opt1> <opt2> –input=<something> –verbose <p>Option: -h –help Показать это сообщение –cat Дополнительная опция –input=<something> Входящий файл [default: my.txt] EOF
Теперь достаточно передать переменную в качестве параметра:
begin arguments = Docopt::docopt(doc) rescue Docopt::Exit => e puts e.message exit end
В случае если аргументы не будут заданы или ваш скрипт будет вызван с ключем -h или –help — будет показано сообщение которое вы и ввели.
В остальных случаях библиотека сама отпарсит строку из переменной doc и сложит все в хэш, который мы уже присвоили переменной arguments.
~/myscript add test argument2 --input=local.txt {"add"=>true, "<opt1>"=>"test", "<opt2>"=>"argument2", "--input"=>"local.txt", "--verbose"=>false, "--help"=>false}
Как мы видим — данные удобно расположились в хэше и мы можем забирать их оттуда используя стандартные механизмы.
puts arguments["<opt1>"] puts arguments["--input"]
Библиотека позволяет использовать необязательные и строго обязательные параметры. Обязательные обозначаются при помощи круглых скобок (), а необязательные — квадратных []
Кроме прочего мы можем ввести несколько стандартов использования перечислив их под строкой Usage:
Usage: #{__FILE__} add <opt1> <opt2> --input=<something> --verbose #{__FILE__} del --input=<something> --sure
А еще можно задавать дэфолтные значения переменным под строкой Options::
--input=<something> Входящий файл [default: my.txt]
Теперь значение в хэше arguments[—input] будет равно my.txt, если явно не указано другое.
Из неприятностей — для чтения ввода прийдется явно использовать канал $stdin
$stdin.gets.chomp
Конец
Собственно это все что следует знать о данной библиотеке.
ссылка на оригинал статьи http://habrahabr.ru/post/183654/
Добавить комментарий