2010-11-22 13 views
207

RubyInstallerをWindowsにインストールしましたが、IMAP Syncを実行していますが、何百ものアカウントを同期するために使用する必要があります。これらの変数をコマンドラインで渡すことができれば、プロセス全体をより自動化することができます。Rubyスクリプトにコマンドラインで変数を渡す

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

答えて

368

このような何か:

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

その後、

$ ./test.rb "test1 test2" 

または

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

私は明示的にいくつかの他の言語がそうであるようにARGV [0]、プログラム名を指していないことを指摘したいと思います。プログラム名を取得するには、http://stackoverflow.com/questions/4834821/how-can-i-get-the-name-of-the-command-called-for-usage-prompts-in-ruby –

161

車輪の再発明をしないでください。 Rubyの方法をチェックしてください。OptionParserライブラリ。

フラグ/スイッチの解析、オプションまたは必須の値を持つパラメータ、単一のオプションにパラメータのリストを解析したり、ヘルプを生成することができます。

また、渡される情報がかなり静的で、実行間で変更されない場合、解析されるYAMLファイルに入れます。そうすれば、コマンドラインで毎回変わるものや、コードの外で時々変更されるものを持つことができます。データとコードの分離はメンテナンスにはいいですね。

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

これは、あなたが簡単にYAMLファイルを生成できるようになる:あなたの目的地はかなり静的であれば

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

これはサンプルのYAMLファイルである:ここで

はと遊ぶためにいくつかのサンプルであり

+1

OptParseを参照してください。リンクが死んでいる。試してみてくださいhttp://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html – Casey

+6

優れた答え;オプション解析が行われた後に 'ARGV'があれば、オペランドだけが残っている(つまり残りの非オプション引数)ことを追加する価値があります。 – mklement0

23

残念ながら、Rubyは、このような通過メカニズムをサポートしていません。 AWK:

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

つまり、名前付きの値をスクリプトに直接渡すことはできません。 CMDオプションを使用

を助けることができる:

> 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 

ルビー格納ARGVアレイ内のすべてのCMD引数を、SCRIPTNAME自体が$PROGRAM_NAME変数を使用して捕捉することができます。

明白な欠点は、値の順序に依存することです。

あなたはブールスイッチはRubyインタプリタのオプション-sを使用するだけで必要な場合:

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

そうRubyは存在しないオプション-agreed文句を言うので、あなたへのスイッチとして渡します、--スイッチを注意してくださいcmdの呼び出し。次のような場合には必要ありません。

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

不利な点は、グローバル変数を混乱させ、論理的な真偽値しか持たないことです。あなたは環境変数から値にアクセスすることができ

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

欠点がためにここに存在している、あなたは(だけあなたのルビープロセスのための)スクリプトの呼び出し前に、すべての変数を設定したり(のような殻をエクスポートする必要がありますBASH):後者の場合

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

は、あなたのデータは同じシェルセッションで皆のために、深刻なセキュリティ上の含意することができ、すべてのサブプロセス、コンピュータで読み取り可能になります。

少なくとも、getoptlongoptparseを使用してオプションパーサーを実装できます。

ハッピーハッキング!

1

cliqrもお試しください。それはかなり新しく、積極的に開発しています。しかし、安定したリリースが用意されています。 git repoは次のとおりです。https://github.com/anshulverma/cliqr

どのように使用できるかについては、サンプルフォルダを参照してください。

1

を実行し、コマンドライン上でこのコードとNの値を入力します。

N = gets; 1.step(N.to_i, 1) { |i| print "hello world\n" } 
関連する問題