Niestety, Ruby nie obsługuje takiego mechanizmu przekazywania, jak np. AWK:
> awk -v a=1 'BEGIN {print a}'
> 1
Oznacza to, że nie można bezpośrednio przekazywać nazwanych wartości do skryptu.
Korzystanie z opcji cmd może pomóc:
> 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 zapisuje wszystkie cmd argumentów w tablicy ARGV
sama scriptname można wyrazić za pomocą zmiennej $PROGRAM_NAME
.
Oczywistą wadą jest to, że zależy to od kolejności wartości.
Jeśli potrzebujesz tylko logiczne przełączniki należy wybrać opcję -s
interpretera Ruby:
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
Uwaga przełącznik --
, inaczej Ruby będzie narzekają nieistniejącej opcji -agreed
, więc przekazać go jako przełączyć się na wywołanie cmd.Nie potrzebujesz tego w następującym przypadku:
> ruby -s script_with_switches.rb -agreed
> So do I!
Wadą jest bałagan ze zmiennymi globalnymi i tylko logiczne wartości true/false.
Można uzyskać dostęp do wartości ze zmiennych środowiskowych:
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
Wady są obecne tu, trzeba ustawić wszystkie zmienne przed wywołaniem skryptu (tylko dla procesu rubinowy) lub ich eksportu (muszle jak BASH):
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
w tym ostatnim przypadku, dane będą czytelne dla wszystkich w tej samej sesji powłoki oraz dla wszystkich podprocesów, które mogą być poważne implikacje bezpieczeństwa.
I przynajmniej możesz zaimplementować parser opcji przy użyciu getoptlong i optparse.
Happy hacking!
Chciałbym wyraźnie podkreślić, że ARGV [0] nie wskazują na nazwę programu, jak niektóre inne języki robić. Aby uzyskać nazwę programu, zobacz http://stackoverflow.com/questions/4834821/how-can-i-get-name-of-the-command-called-for-usage-prompts-in-ruby –