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 przekazać nazwanych wartości bezpośrednio 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 przechowuje wszystkie argumenty cmd w ARGV
tablicy, sama nazwa skryptu może zostać przechwycona za pomocą $PROGRAM_NAME
zmiennej.
Oczywistą wadą jest to, że zależy od kolejności wartości.
Jeśli potrzebujesz tylko przełączników boolowskich, skorzystaj z opcji -s
interpretera Ruby:
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
Zwróć uwagę na --
przełącznik, w przeciwnym razie Ruby będzie narzekać na nieistniejącą opcję -agreed
, więc przekaż go jako przełącznik do wywołania cmd. Nie potrzebujesz go w następującym przypadku:
> ruby -s script_with_switches.rb -agreed
> So do I!
Wadą jest to, że mieszasz zmienne globalne i masz tylko logiczne wartości prawda / fałsz.
Możesz uzyskać dostęp do wartości ze zmiennych środowiskowych:
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
Wadami są tutaj: musisz ustawić wszystkie zmienne przed wywołaniem skryptu (tylko dla twojego procesu ruby) lub wyeksportować je (powłoki jak BASH):
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
W tym drugim przypadku twoje dane będą czytelne dla wszystkich w tej samej sesji powłoki i dla wszystkich podprocesów, co może mieć poważne konsekwencje dla bezpieczeństwa.
A przynajmniej można wdrożyć parser opcji przy getoptlong i optparse .
Miłego hakowania!