К сожалению, 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 .
Счастливого взлома!