К сожалению, Ruby не поддерживает такой механизм передачи, как, например, AWK:
> awk -v a=1 'BEGIN {print a}'
> 1
Это означает, что вы не можете передавать именованные значения в ваш скрипт напрямую.
Использование параметров cmd может помочь:
> ruby script.rb val_0 val_1 val_2
# script.rb
puts ARGV[0] # => val_0
puts ARGV[1] # => val_1
puts ARGV[2] # => val_2
Ruby хранит все аргументы cmd в ARGV
массиве, само имя сценария может быть записано с помощью $PROGRAM_NAME
переменной.
Очевидным недостатком является то, что вы зависите от порядка значений.
Если вам нужны только булевы ключи, используйте опцию -s
интерпретатора Ruby:
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
Обратите внимание на --
переключатель, в противном случае Ruby будет жаловаться на несуществующий параметр -agreed
, поэтому передайте его как переключатель для вызова cmd. Вам не нужно это в следующем случае:
> ruby -s script_with_switches.rb -agreed
> So do I!
Недостатком является то, что вы связываетесь с глобальными переменными и имеете только логические значения true / false.
Вы можете получить доступ к значениям из переменных среды:
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
Здесь есть недостатки, вам нужно установить все переменные перед вызовом скрипта (только для вашего процесса ruby) или экспортировать их (оболочки типа BASH):
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
В последнем случае ваши данные будут доступны для чтения всем участникам одного и того же сеанса оболочки и всем подпроцессам, что может стать серьезным следствием для безопасности.
И, по крайней мере, вы можете реализовать парсер опций, используя getoptlong и optparse .
Счастливого взлома!