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

в 5:37, , рубрики: docopt, ruby, системное администрирование, метки: ,

Предупреждение: для аксакалов статья вряд ли будет полезна. А то и вовсе окажется вредна. Системным администраторам, использующим язык 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

Конец

Собственно это все что следует знать о данной библиотеке.

Автор: ctrlok

Источник

Поделиться

* - обязательные к заполнению поля