0

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

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

4

5 回答 5

89

ARGVRuby的意义何在?

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

什么时候运行你需要做的文件:ruby ex1.rb并输入你需要输入的第一个、第二个和第三个变量ruby ex1.rb blah blah blah

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

ruby ex1.rb -a -b 3

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

任何其他命令行程序都能这样做的好处是相同的:用户可以预先指定他们想要的东西,而且它比交互式 CLI 更容易编写脚本。

他们无论如何都不能这样做,因为我认为它是一个可执行文件。

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

于 2012-11-11T07:01:03.687 回答
26

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

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

Thereargc表示提供的参数的数量,并且argv是一个低级指针,指向可能的多个字符串指针中的第一个。这个名字argv以各种形式存在。

命令行参数在开发人员中非常流行,尽管它们通常不像您想象的那样使用。未命名的参数更难处理。这就是为什么存在类似的东西optparse来帮助处理它们的原因。

这是OptionParser 文档中的一个示例:

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

这使得参数是什么很明显,因为它们被命名了。

于 2012-11-11T07:18:02.337 回答
13

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

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

可以ARGV用来实现这些接受参数的命令行程序。虽然我们经常为此目的使用OptionParser 标准库或其他一些工具,但 ARGV 是构建这些工具的底层集合。

因此,如果您曾经运行过gemrailsrakebundle,或任何用 Ruby 编写的命令行开发工具,您将受益于ARGV!

于 2012-11-11T15:09:04.013 回答
5

关键ARGV是它使脚本能够在没有人工输入的情况下运行,并且还允许输入可能从一个迭代到下一个迭代变化的情况。

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

于 2014-02-12T18:01:45.440 回答
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

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

更进一步,我制作了一个 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 非常陌生,并希望学习更好的使用方法,但这是我发现非常有用的一个功能。

于 2014-11-18T16:38:48.023 回答