Парсим аргументы коммандной строки

от автора

Предупреждение: для аксакалов статья вряд ли будет полезна. А то и вовсе окажется вредна. Системным администраторам, использующим язык ruby для написания сценариев — строго рекомендуется.

Для парсинга аргументов коммандной строки я обычно использовал библиотеку 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *