2010-11-22 7 views
207

Ho installato RubyInstaller su Windows e sto utilizzando IMAP Sync ma ho bisogno di usarlo per sincronizzare centinaia di account. Se potessi passare queste variabili attraverso la linea di comando, potrei automatizzare l'intero processo meglio.Passare le variabili allo script Ruby tramite la riga di comando

# 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' 

risposta

368

Qualcosa di simile a questo:

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

poi

$ ./test.rb "test1 test2" 

o

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

vorrei sottolineare esplicitamente che ARGV [0] non indica il nome del programma, come alcune altre lingue fanno. Per ottenere il nome del programma, vedere http://stackoverflow.com/questions/4834821/how-can-i-get-the-name-of-the-command-called-for-usage-prompts-in-ruby –

161

Non reinventare la ruota; controlla la libreria di Ruby's way-cool OptionParser.

Offre l'analisi di flag/switch, parametri con valori facoltativi o richiesti, può analizzare elenchi di parametri in un'unica opzione e può generare il vostro aiuto per voi.

Inoltre, se una delle tue informazioni è passata in modo statico, che non cambia tra le esecuzioni, inseriscile in un file YAML che viene analizzato. In questo modo puoi avere cose che cambiano ogni volta sulla riga di comando e cose che cambiano occasionalmente configurate al di fuori del tuo codice. Questa separazione di dati e codice è utile per la manutenzione.

Ecco alcuni esempi con cui giocare:

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'] 

Questo file YAML di esempio, se le destinazioni sono abbastanza statica:

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

Questo vi permetterà di generare facilmente un file 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 il collegamento è morto. Prova http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html – Casey

+6

Ottima risposta; potrebbe valere la pena di aggiungere che dopo l'analisi delle opzioni, 'ARGV' contiene solo gli operandi, se ce ne sono (vale a dire gli argomenti rimanenti, NON-option). – mklement0

23

Sfortunatamente, Ruby non supporta tale meccanismo di passaggio come ad es. AWK:

> awk -v a=1 'BEGIN {print a}' 
> 1 

Significa che non è possibile passare direttamente i valori denominati nello script.

Utilizzo delle opzioni di cmd possono aiutare:

> 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 

memorizza tutti rubino argomenti CMD nella matrice ARGV, lo scriptname stessa può essere catturato utilizzando la variabile $PROGRAM_NAME.

L'ovvio svantaggio è che si dipende dall'ordine dei valori.

Se avete bisogno solo interruttori booleane utilizzare l'opzione -s dell'interprete di Ruby:

> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed 
> So do I! 

Si prega di notare l'interruttore --, altrimenti Rubino si lamenterà un'opzione inesistente -agreed, in modo da passare come un interruttore per la vostra invocazione di cmd.Non è necessario che nel seguente caso:

> ruby -s script_with_switches.rb -agreed 
> So do I! 

Lo svantaggio è che si fa confusione con le variabili globali e hanno solo logiche falsi valori/veri.

È possibile accedere a valori da variabili d'ambiente:

> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]' 
> Andy Warhol 

inconvenienti sono presenti qui per, è necessario impostare tutte le variabili prima l'invocazione di script (solo per il processo Ruby) o di esportarle (conchiglie come BASH):

> export FIRST_NAME='Andy Warhol' 
> ruby -e 'puts ENV["FIRST_NAME"]' 

in quest'ultimo caso, i dati saranno leggibili per tutti nella stessa sessione di shell e per tutti i sottoprocessi, che può essere un grave implicazione di sicurezza.

E almeno è possibile implementare un parser di opzioni utilizzando getoptlong e optparse.

Happy hacking!

1

È anche possibile provare cliqr. È abbastanza nuovo e in sviluppo attivo. Ma ci sono versioni stabili pronte per essere utilizzate. Ecco il repository git: https://github.com/anshulverma/cliqr

Cerca nella cartella di esempio per avere un'idea di come può essere utilizzato.

1

eseguire questo codice sulla riga di comando e immettere il valore di N:

N = gets; 1.step(N.to_i, 1) { |i| print "hello world\n" } 
Problemi correlati