2010-11-22 12 views
207

Zainstalowałem RubyInstaller w systemie Windows i pracuję pod numerem IMAP Sync, ale muszę użyć go do zsynchronizowania setek kont. Gdybym mógł przekazać te zmienne do niego za pomocą wiersza poleceń, mógłbym lepiej zautomatyzować cały proces.Prześlij zmienne do skryptu Ruby za pomocą wiersza polecenia

# Source server connection info. 
SOURCE_NAME = '[email protected]' 
SOURCE_HOST = 'mail.example.com' 
SOURCE_PORT = 143 
SOURCE_SSL = false 
SOURCE_USER = 'username' 
SOURCE_PASS = 'password' 

# Destination server connection info. 
DEST_NAME = '[email protected]' 
DEST_HOST = 'imap.gmail.com' 
DEST_PORT = 993 
DEST_SSL = true 
DEST_USER = '[email protected]' 
DEST_PASS = 'password' 

Odpowiedz

368

coś takiego:

ARGV.each do|a| 
    puts "Argument: #{a}" 
end 

następnie

$ ./test.rb "test1 test2" 

lub

v1 = ARGV[0] 
v2 = ARGV[1] 
puts v1  #prints test1 
puts v2  #prints test2 
+62

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 –

161

Nie wyważać otwartych drzwi; sprawdź bibliotekę Ruby'ego, która jest fajna, OptionParser.

Oferuje analizowanie flag/przełączników, parametrów z opcjonalnymi lub wymaganymi wartościami, może analizować listę parametrów w jednej opcji i może wygenerować dla ciebie pomoc.

Ponadto, jeśli którakolwiek z twoich informacji jest przekazywana w dość statyczny sposób, nie zmienia się pomiędzy kolejnymi uruchomieniami, umieść ją w pliku YAML, który zostanie przeanalizowany. W ten sposób możesz mieć rzeczy, które zmieniają się za każdym razem w linii poleceń, i rzeczy, które zmieniają się sporadycznie poza twoim kodem. Ta separacja danych i kodu jest dobra dla konserwacji.

Oto niektóre próbki do zabawy:

require 'optparse' 
require 'yaml' 

options = {} 
OptionParser.new do |opts| 
    opts.banner = "Usage: example.rb [options]" 

    opts.on('-n', '--sourcename NAME', 'Source name') { |v| options[:source_name] = v } 
    opts.on('-h', '--sourcehost HOST', 'Source host') { |v| options[:source_host] = v } 
    opts.on('-p', '--sourceport PORT', 'Source port') { |v| options[:source_port] = v } 

end.parse! 

dest_options = YAML.load_file('destination_config.yaml') 
puts dest_options['dest_name'] 

Ten plik jest YAML próbka jeśli miejsca docelowe są dość statyczne:

--- 
dest_name: [email protected] 
dest_host: imap.gmail.com 
dest_port: 993 
dest_ssl: true 
dest_user: [email protected] 
dest_pass: password 

To pozwoli Ci łatwo wygenerować plik YAML:

require 'yaml' 

yaml = { 
    'dest_name' => '[email protected]', 
    'dest_host' => 'imap.gmail.com', 
    'dest_port' => 993, 
    'dest_ssl' => true, 
    'dest_user' => '[email protected]', 
    'dest_pass' => 'password' 
} 

puts YAML.dump(yaml) 
+1

OptParse link jest martwy. Wypróbuj http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html – Casey

+6

Doskonała odpowiedź; Warto dodać, że po zakończeniu analizy opcji 'ARGV' zawiera tylko operandy, jeśli takie istnieją (tj. pozostałe argumenty opcji NON). – mklement0

23

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!

1

Możesz również wypróbować cliqr. Jest całkiem nowy i aktywnie się rozwija. Są jednak stabilne wersje gotowe do użycia. Oto repozytorium git: https://github.com/anshulverma/cliqr

Zajrzyj do folderu z przykładami, aby zorientować się, w jaki sposób można go użyć.

1

uruchomić ten kod w wierszu poleceń i wpisać wartość N:

N = gets; 1.step(N.to_i, 1) { |i| print "hello world\n" } 
Powiązane problemy