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