Ответ 1
Что-то вроде этого:
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
Я установил RubyInstaller в Windows, и я запускаю IMAP Sync, но мне нужно использовать его для синхронизации сотен учетных записей. Если бы я мог передать эти переменные в командной строке, я мог бы автоматизировать весь процесс лучше.
# 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'
Что-то вроде этого:
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
Не изобретайте велосипед; ознакомьтесь с библиотекой Ruby 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: [email protected]
dest_host: imap.gmail.com
dest_port: 993
dest_ssl: true
dest_user: [email protected]
dest_pass: password
Это позволит вам легко сгенерировать файл 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)
К сожалению, Ruby не поддерживает такой механизм передачи, как, например, AWK:
> awk -v a=1 'BEGIN {print a}'
> 1
Это означает, что вы не можете напрямую передавать именованные значения в свой script.
Использование параметров 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
Ruby хранит все аргументы cmd в массиве ARGV
, само имя сценария может быть захвачено с помощью переменной $PROGRAM_NAME
.
Очевидным недостатком является то, что вы зависите от порядка значений.
Если вам нужны только логические ключи, используйте опцию -s
интерпретатора Ruby:
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
Обратите внимание на переключатель --
, иначе Ruby будет жаловаться на несуществующую опцию -agreed
, поэтому передайте ее как переключатель для вашего вызова smd. Вам это не нужно в следующем случае:
> ruby -s script_with_switches.rb -agreed
> So do I!
Недостатком является то, что вы возитесь с глобальными переменными и имеете только логические значения true/false.
Вы можете получить доступ к значениям из переменных среды:
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
Здесь присутствуют недостатки, вы должны установить все переменные перед вызовом script (только для рубинового процесса) или экспортировать их (оболочки типа BASH):
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
В последнем случае ваши данные будут прочитаны для всех в одном сеансе оболочки и для всех подпроцессов, что может быть серьезной проблемой безопасности.
И по крайней мере вы можете реализовать парсер параметров, используя getoptlong и optparse.
Счастливый взлом!
Вы также можете попробовать cliqr
. Его довольно новое и активное развитие. Но есть стабильные релизы, готовые к использованию. Вот git repo: https://github.com/anshulverma/cliqr
Посмотрите в примерную папку, чтобы получить представление о том, как ее можно использовать.
Если это не самый простой случай, есть только один разумный способ использовать параметры командной строки в Ruby. Это называется docopt и задокументировано здесь.
Что удивительного в этом, так это простота. Все, что вам нужно сделать, это указать текст "справки" для вашей команды. То, что вы там пишете, будет автоматически проанализировано отдельной (!) Библиотекой ruby.
Из примера:
#!/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" }
Вы должны попробовать gem console_runner. Этот гем делает ваш чистый код Ruby исполняемым из командной строки. Все, что вам нужно, это добавить аннотации YARD в ваш код:
# @runnable This tool can talk to you. Run it when you are lonely.
# Written in Ruby.
class MyClass
def initialize
@hello_msg = 'Hello'
@bye_msg = 'Good Bye'
end
# @runnable Say 'Hello' to you.
# @param [String] name Your name
# @param [Hash] options options
# @option options [Boolean] :second_meet Have you met before?
# @option options [String] :prefix Your custom prefix
def say_hello(name, options = {})
second_meet = nil
second_meet = 'Nice to see you again!' if options['second_meet']
prefix = options['prefix']
message = @hello_msg + ', '
message += "#{prefix} " if prefix
message += "#{name}. "
message += second_meet if second_meet
puts message
end
end
Затем запустите его из консоли:
$ c_run /projects/example/my_class.rb say_hello -n John --second-meet --prefix Mr.
-> Hello, Mr. John. Nice to see you again!