ARGV在Ruby中有什么意义?

时间:2012-11-11 06:36:28

标签: ruby stdin argv

Ruby中的ARGV有什么意义?

first, second, third = ARGV 
puts "The script is called: #{$0}"
puts "Your first variable is: #{first}"
puts "Your second variable is: #{second}"
puts "Your third variable is: #{third}"

运行我需要执行的文件时,重点是什么:

ruby ex1.rb

并输入我需要输入的第一,第二和第三个变量

ruby ex1.rb blah blah blah

这对所有运行程序的人有什么好处?他们无论如何都做不到,因为我认为它是一个可执行文件:

user = ARGV.first
prompt = '> '

puts "Hi #{user}, I'm the #{$0} script."
puts "I'd like to ask you a few questions."
puts "Do you like me #{user}?"
print prompt
likes = STDIN.gets.chomp()

puts "Where do you live #{user}?"
print prompt
lives = STDIN.gets.chomp()

puts "What kind of computer do you have?"
print prompt
computer = STDIN.gets.chomp()

puts <<MESSAGE
Alright, so you said #{likes} about liking me.
You live in #{lives}.  Not sure where that is.
And you have a #{computer} computer.  Nice.
MESSAGE

有人可以向我解释一下吗?

5 个答案:

答案 0 :(得分:85)

  

Ruby中ARGV有什么意义?

ARGV“包含传递给脚本的参数,每个元素一个。”

  

运行您需要执行的文件时,有什么意义:ruby ex1.rb并输入您需要输入ruby ex1.rb blah blah blah的第一,第二和第三个变量。

这是确切的一点,能够在运行文件时指定参数,如:

ruby ex1.rb -a -b 3
  

这对所有运行程序的人有什么好处?

任何其他命令行程序都可以获得相同的好处:用户可以预先指定他们想要的内容,并且比交互式CLI更容易编写脚本。

  

他们无论如何都做不到,因为我认为它是可执行文件。

是的,他们可以。您刚刚举例说明了用户如何以这种方式运行程序。它是否可执行不会改变任何东西。

答案 1 :(得分:24)

ARGV有着悠久的传统,来自UNIX / POSIX世界,其中大多数C程序必须包含以下内容:

int main(int argc, char **argv)
{
   return(0);
}

argc表示提供的参数数量,argv是指向第一个可能包含多个字符串指针的低级指针。名称argv以各种形式存在。

命令行参数非常受开发人员的欢迎,尽管它们通常不像你想象的那样使用。未命名的参数更难处理。这就是为什么optparse之类的东西可以帮助处理它们的原因。

以下是the OptionParser documentation的示例:

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
    options[:verbose] = v
  end
end.parse!

p options
p ARGV

这允许您定义更多可用的命令行参数,然后使用它们。对于你的例子,我希望它能像这样工作:

test_script --live "New York" --computer "Lenovo" --like

这使得参数变得非常明显,因为它们被命名了。

答案 2 :(得分:13)

考虑一些Ruby命令行实用程序,例如railsrakegembundle。虽然这些都不是最终用户应用程序(如Web应用程序或GUI应用程序),但它们仍然是用Ruby编写的用户与之交互的程序。他们都接受了争论:

$ rails new my_app
$ rake tests
$ gem install rails --no-rdoc --no-ri
$ bundle update

可以使用ARGV来实现接受参数的这类命令行程序。虽然我们经常使用OptionParser standard library或其他工具来实现此目的,但ARGV是这些工具构建在其上的低级别集合。

因此,如果您曾经运行gemrailsrakebundle,或者使用Ruby编写的任何命令行开发人员工具,那么您将拥有受益于ARGV

答案 3 :(得分:5)

ARGV的要点是它使脚本能够在没有人为输入的情况下运行,并且还允许输入可能在一次迭代到下一次迭代之间变化的情况。

例如,您可能正在运行三个不同的脚本来获取三个值。然后可以将这些值传递到此脚本中,ARGV可用于获取这些选项的值。

答案 4 :(得分:3)

我曾经运行过一个要求我提供电子邮件和密码的脚本。它被用来登录100个帐户中的一个。像大多数Ruby脚本一样,我会从命令行运行它。这必须看起来像是一个“可执行文件”,特别是没有你点击的图标。

我会运行该程序,它会询问我的电子邮件和密码,然后使用Watir登录。

puts "Email of Account"
account_email = gets.chomp

puts "Enter Password"
password = gets.chomp

# code that logs me in

然而,我发现通过ARGV获取这些值对我来说要快得多。

account_email, password = ARGV
# code that logs me in

然后我可以输入

$ ruby my_script.rb my.email@emailplace.com mypassword

然后按Enter键。我也可以按控制台中的向上箭头一次又一次地运行它或者使用不同名称和密码的最新版本来快速测试我的脚本。

更进一步,我制作了一个shell脚本,可以运行这些脚本,args以及所有组合

ruby my_script.rb oneofmy@emails.com mypassword
ruby my_script.rb another@emails.com otherpassword

最后,有时我需要在每次运行脚本时设置几十个设置,然后多次运行该脚本。所以我也可以从命令行轻松地将几十个变量插入到脚本中

ruby my_script.rb option1 option2 option3 option4

我很擅长使用ARGV并希望学习更好的方法来使用它,但这是我发现非常有用的一个功能。