Поскольку никто не упоминал об этом, а название означает относится к дешевому разбору командной строки, почему бы просто не позволить интерпретатору ruby выполнить эту работу за вас? Если вы передадите переключатель -s
(например, в своем shebang), вы получите простые простые переключатели, назначенные однобуквенным глобальным переменным. Вот ваш пример использования этого переключателя:
#!/usr/bin/env ruby -s
puts "#$0: Quiet=#$q Interactive=#$i, ARGV=#{ARGV.inspect}"
А вот вывод, когда я сохраняю его как ./test
и chmod +x
:
$ ./test
./test: Quiet= Interactive=, ARGV=[]
$ ./test -q foo
./test: Quiet=true Interactive=, ARGV=["foo"]
$ ./test -q -i foo bar baz
./test: Quiet=true Interactive=true, ARGV=["foo", "bar", "baz"]
$ ./test -q=very foo
./test: Quiet=very Interactive=, ARGV=["foo"]
Подробнее см. ruby -h
. :)
То, что должно быть настолько дешевым, насколько это возможно. Это вызовет NameError, если вы попытаетесь переключиться, как -:
, так что там есть некоторая проверка. Конечно, у вас не может быть никаких переключателей после аргумента без переключателя, но если вам нужно что-то необычное, вам действительно следует использовать как минимум OptionParser. На самом деле, единственное, что меня раздражает в этой технике, - это то, что вы получите предупреждение (если вы их включили) при доступе к неустановленной глобальной переменной, но это все еще не так, поэтому она отлично работает для одноразовых инструментов и быстрых скрипты.
Одно предостережение (, как указал FelipeC в комментариях ), что ваша оболочка может не поддерживать 3-жетный шебанг; вам может понадобиться заменить /usr/bin/env ruby -w
на фактический путь к вашему рубину (например, /usr/local/bin/ruby -w
), или запустить его из скрипта-обёртки, или что-то в этом роде.