명령 줄을 통해 Ruby 스크립트에 변수 전달


Answers

바퀴를 재발 명하지 마십시오. Ruby 's way-cool OptionParser 라이브러리를 확인하십시오.

플래그 / 스위치 구문 분석, 선택적 또는 필수 값이있는 매개 변수, 매개 변수 목록을 단일 옵션으로 구문 분석하여 도움을 얻을 수 있습니다.

또한 전달되는 정보가 매우 정적 인 경우, 실행간에 변경되지 않고 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 파일입니다.

--- 
dest_name: username@gmail.com
dest_host: imap.gmail.com
dest_port: 993
dest_ssl: true
dest_user: username@gmail.com
dest_pass: password

이렇게하면 YAML 파일을 쉽게 생성 할 수 있습니다.

require 'yaml'

yaml = {
  'dest_name' => 'username@gmail.com',
  'dest_host' => 'imap.gmail.com',
  'dest_port' => 993,
  'dest_ssl'  => true,
  'dest_user' => 'username@gmail.com',
  'dest_pass' => 'password'
}

puts YAML.dump(yaml)
Question

Windows에 RubyInstaller를 설치했고 IMAP Sync를 실행하고 있지만 수백 개의 계정을 동기화 할 때 사용해야합니다. 명령 줄을 통해 이러한 변수를 전달할 수 있다면 전체 프로세스를 자동화 할 수 있습니다.

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

# Destination server connection info.
DEST_NAME = 'username@gmail.com'
DEST_HOST = 'imap.gmail.com'
DEST_PORT = 993
DEST_SSL  = true
DEST_USER = 'username@gmail.com'
DEST_PASS = 'password'



가장 사소한 경우가 아니라면 Ruby에서 명령 행 옵션을 사용할 수있는 유일한 방법이 있습니다. docopt 라고 docopt here 문서화되어 here .

그것으로 놀랍습니다. 간단합니다. 명령에 대한 "도움말"텍스트를 지정하면됩니다. 거기서 쓰는 것은 독립형 (!) 루비 라이브러리에 의해 자동으로 파싱됩니다.

example :

#!/usr/bin/env ruby
require 'docopt.rb'

doc = <<DOCOPT
Usage: #{__FILE__} --help
       #{__FILE__} -v...
       #{__FILE__} go [go]
       #{__FILE__} (--path=<path>)...
       #{__FILE__} <file> <file>

Try: #{__FILE__} -vvvvvvvvvv
     #{__FILE__} go go
     #{__FILE__} --path ./here --path ./there
     #{__FILE__} this.txt that.txt

DOCOPT

begin
  require "pp"
  pp Docopt::docopt(doc)
rescue Docopt::Exit => e
  puts e.message
end

출력 :

$ ./counted_example.rb -h
Usage: ./counted_example.rb --help
       ./counted_example.rb -v...
       ./counted_example.rb go [go]
       ./counted_example.rb (--path=<path>)...
       ./counted_example.rb <file> <file>

Try: ./counted_example.rb -vvvvvvvvvv
     ./counted_example.rb go go
     ./counted_example.rb --path ./here --path ./there
     ./counted_example.rb this.txt that.txt

$ ./counted_example.rb something else
{"--help"=>false,
 "-v"=>0,
 "go"=>0,
 "--path"=>[],
 "<file>"=>["something", "else"]}

$ ./counted_example.rb -v
{"--help"=>false, "-v"=>1, "go"=>0, "--path"=>[], "<file>"=>[]}

$ ./counted_example.rb go go
{"--help"=>false, "-v"=>0, "go"=>2, "--path"=>[], "<file>"=>[]}

즐겨!




명령 행에서이 코드를 실행하고 N 값을 입력하십시오.

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