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!
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 –