কমান্ড লাইনের মাধ্যমে রুবি স্ক্রিপ্টে ভেরিয়েবলগুলি পাস করুন


275

আমি উইন্ডোজে রুবিআইনস্টলার ইনস্টল করেছি এবং আমি আইএমএপ সিঙ্ক চালাচ্ছি তবে শত শত অ্যাকাউন্ট সিঙ্ক করতে আমার এটি ব্যবহার করা দরকার। আমি যদি কমান্ড লাইনের মাধ্যমে এই ভেরিয়েবলগুলি এতে পাস করতে পারি তবে আমি পুরো প্রক্রিয়াটি আরও ভালভাবে স্বয়ংক্রিয় করতে পারতাম।

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

1
আপনি এই জনপ্রিয় প্রশ্নটিকে একটি আসল প্রশ্নে সম্পাদনা বিবেচনা করতে পারেন ।
not2qubit

উত্তর:


465

এটার মতো কিছু:

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

84
আমি স্পষ্টভাবে উল্লেখ করতে চাই যে এআরজিভি [0] প্রোগ্রামের নামের দিকে ইঙ্গিত করে না, যেমন কিছু অন্যান্য ভাষায়। প্রোগ্রামটির নাম পেতে স্ট্যাকওভারফ্লো.com
স্যান্ডার মের্টেনস

3
`" টেস্ট 1 টেস্ট 2 "কি কেবল একটি যুক্তি নয়?
উলিওং

এটির মতো চালানোর জন্য আপনাকে ফাইলের #!/usr/bin/env rubyশীর্ষে যুক্ত .rbকরতে হবে:./test.rb
xamenrax

191

চাকা পুনরায় উদ্ভাবন করবেন না; রুবির উপায়-শীতল অপশনপার্সার লাইব্রেরিটি দেখুন।

এটি পতাকা / সুইচগুলির পার্সিং, ingচ্ছিক বা প্রয়োজনীয় মানগুলির সাথে পরামিতি সরবরাহ করে, পরামিতিগুলির তালিকাকে একক বিকল্পে পার্স করতে পারে এবং আপনার জন্য আপনার সহায়তা জেনারেট করতে পারে।

এছাড়াও, যদি আপনার কোনও তথ্য পাস করা হয় তবে তা স্থির হয়, যা রানের মধ্যে পরিবর্তিত হয় না, এটি একটি ওয়াইএএমএল ফাইলে রাখুন যা পার্স হয়ে যায়। এইভাবে আপনার কমান্ড-লাইনে প্রতিবার পরিবর্তিত জিনিসগুলি এবং আপনার কোডের বাইরে মাঝে মাঝে কনফিগার হওয়া জিনিসগুলি থাকতে পারে। ডেটা এবং কোডের বিচ্ছেদটি রক্ষণাবেক্ষণের জন্য দুর্দান্ত।

এখানে খেলতে কয়েকটি নমুনা রয়েছে:

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

এটি আপনাকে সহজেই একটি ওয়াইএএমএল ফাইল তৈরি করতে দেয়:

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)

2
OptParse লিঙ্কটি মারা গেছে। রুবি-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/…
কেসি

7
দুর্দান্ত উত্তর; অপশন-পার্সিংয়ের পরে যোগ করার উপযুক্ত হতে পারে, ARGVকেবল অপারেন্ডস রয়েছে, যদি থাকে (তবে এটি অবশিষ্ট, নন-বিকল্প যুক্তি)।
mklement0

27

দুর্ভাগ্যক্রমে, রুবি যেমন পাস করার পদ্ধতিটিকে সমর্থন করে না যেমন এডাব্লুকে:

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

এর অর্থ হল আপনি সরাসরি স্ক্রিপ্টে নাম দেওয়া মানগুলি পাস করতে পারবেন না।

সেমিডি বিকল্প ব্যবহার করতে সাহায্য করতে পারে:

> 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অ্যারেতে সমস্ত সেমিডি আর্গুমেন্ট সংরক্ষণ করে, স্ক্রিপ্টের নামটি নিজেই $PROGRAM_NAMEভেরিয়েবল ব্যবহার করে ক্যাপচার করা যায় ।

সুস্পষ্ট অসুবিধাটি হ'ল আপনি মানগুলির ক্রমের উপর নির্ভরশীল।

আপনার যদি কেবল বুলিয়ান সুইচগুলির প্রয়োজন -sহয় তবে রুবি ইন্টারপ্রেটারের বিকল্পটি ব্যবহার করুন :

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

অনুগ্রহ করে --স্যুইচটি নোট করুন , অন্যথায় রুবি কোনও অস্তিত্বহীন বিকল্প সম্পর্কে অভিযোগ করবে -agreed, সুতরাং এটি আপনার সেন্টিমিডে চলার জন্য স্যুইচ হিসাবে পাস করুন। নিম্নলিখিত ক্ষেত্রে আপনার এটির দরকার নেই:

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

পরবর্তী ক্ষেত্রে, আপনার ডেটা একই শেল সেশনের প্রত্যেকের জন্য এবং সমস্ত উপ-প্রক্রিয়াগুলির জন্য পঠনযোগ্য হবে, যা মারাত্মক সুরক্ষা জড়িত হতে পারে।

এবং অন্তত আপনি getoptlong এবং optparse ব্যবহার করে একটি বিকল্প পার্সার প্রয়োগ করতে পারেন ।

শুভ হ্যাকিং!


1

আপনিও চেষ্টা করে দেখতে পারেন cliqr। এটি বেশ নতুন এবং সক্রিয় বিকাশে। তবে ব্যবহারের জন্য প্রস্তুত স্থিতি প্রকাশ রয়েছে। এখানে গিট রেপো: https://github.com/anshulverma/cliqr

এটি কীভাবে ব্যবহার করা যায় সে সম্পর্কে ধারণা পেতে উদাহরণ ফোল্ডারটি দেখুন।


0

কমান্ড লাইনে এই কোডটি চালান এবং এন এর মান লিখুন:

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

0

যদি এটি সবচেয়ে তুচ্ছ ঘটনা না হয় তবে রুবিতে কমান্ড লাইন বিকল্পগুলি ব্যবহার করার একমাত্র বুদ্ধিমান উপায় রয়েছে। একে ডকোপট বলা হয় এবং এখানে নথিভুক্ত করা হয়

এটি দিয়ে আশ্চর্যজনক কী, এটি কি সরলতা। আপনাকে যা করতে হবে তা হ'ল আপনার আদেশের জন্য "সহায়তা" পাঠ্য নির্দিষ্ট করুন। আপনি সেখানে যা লিখবেন তারপরে স্ট্যান্ডেলোন (!) রুবি লাইব্রেরি দ্বারা অটো-পার্স করা হবে ।

উদাহরণ থেকে :

#!/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>"=>[]}

উপভোগ করুন!


0

আপনার কনসোল_ রুনার মণির চেষ্টা করা উচিত । এই রত্নটি আপনার খাঁটি রুবি কোডকে কমান্ড-লাইন থেকে নির্বাহযোগ্য করে তোলে। আপনার যা দরকার তা হ'ল আপনার কোডে ইএআরডি টীকা যুক্ত করা:

# @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!

0

TL; ড

আমি জানি এটি পুরানো, তবে গেটোপলং এখানে উল্লেখ করা হয়নি এবং সম্ভবত আজ কমান্ড লাইন যুক্তি পার্স করার সর্বোত্তম উপায়।


কমান্ড লাইন যুক্তি পার্স করা হচ্ছে

আমি দৃ strongly ়ভাবে getoptlong সুপারিশ । এটি ব্যবহার করা বেশ সহজ এবং একটি কবজির মতো কাজ করে। উপরের লিঙ্কটি থেকে এখানে নেওয়া উদাহরণ

require 'getoptlong'

opts = GetoptLong.new(
    [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
    [ '--repeat', '-n', GetoptLong::REQUIRED_ARGUMENT ],
    [ '--name', GetoptLong::OPTIONAL_ARGUMENT ]
)

dir = nil
name = nil
repetitions = 1
opts.each do |opt, arg|
    case opt
        when '--help'
            puts <<-EOF
hello [OPTION] ... DIR

-h, --help:
     show help

--repeat x, -n x:
     repeat x times

--name [name]:
     greet user by name, if name not supplied default is John

DIR: The directory in which to issue the greeting.
            EOF
        when '--repeat'
            repetitions = arg.to_i
        when '--name'
            if arg == ''
                name = 'John'
            else
                name = arg
            end
    end
end

if ARGV.length != 1
    puts "Missing dir argument (try --help)"
    exit 0
end

dir = ARGV.shift

Dir.chdir(dir)
for i in (1..repetitions)
    print "Hello"
    if name
        print ", #{name}"
    end
    puts
end

আপনি এটিকে কল করতে পারেন ruby hello.rb -n 6 --name -- /tmp

ওপি কী করার চেষ্টা করছে

এই ক্ষেত্রে আমি মনে করি সেরা উত্তরটি হ'ল এই উত্তরটিতে প্রস্তাবিত ওয়াইএএমএল ফাইলগুলি ব্যবহার করা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.