2012-11-11 50 views
1

Ruby中的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 

有人可以向我解釋這個嗎?

+4

「他們無法做到,因爲我認爲它是可執行文件」顯示了思想上的缺陷。如果可執行文件有什麼不同?這只是在操作系統中設置的一小部分,不會影響腳本是否可以接受參數。也許你的意思是腳本會被啓動並與GUI一起使用,但即使如此,腳本也可能接收參數作爲其啓動過程的一部分......這讓我覺得這個問題是錯誤的。 –

+2

在給出的示例中,所有輸入都在運行期間收集,以響應用戶輸入。 ARGV將在運行開始時收集數據,無需用戶輸入。 – JDS

+2

考慮上面代碼的每個「塊」都相當昂貴的情況,運行10秒。你寧願打字,等10s,打字,等10s等等 - 或 - 鍵入,然後等待30秒?有一個例子說明爲什麼在初始執行時提供參數是有用的,而不是在需要時提供參數。 –

回答

78

Ruby中ARGV是什麼?

ARGV「包含傳遞給腳本的參數,每個元素一個。」

什麼的這點時運行,你需要做的文件:ruby ex1.rb,並把在您需要ruby ex1.rb blah blah blah鍵入第一,第二和第三變量。

這是確切點,運行像文件時,可以指定參數:

ruby ex1.rb -a -b 3 

如何在所有的人這樣做的好處運行的程序?

同樣有益於任何其他命令行程序能夠這樣做:用戶可以預先指定他們想要的內容,而且腳本比交互式CLI更容易。

因爲我認爲它是一個可執行文件,所以它們無法執行。

是的,他們可以。您剛剛舉了一個用戶如何以這種方式運行程序的例子。無論是否可執行都不會改變任何內容。

+14

恩,這是否回答你的問題?不要忘記[upvote /接受你的問題的答案](http://meta.stackexchange.com/a/5235/158402)':)' –

+0

我正在通過相同的問題,最初有一些困惑,但然後能夠解決它。您的ARGV答案有助於確認我的理解。我唯一的問題是user =「ARGV.first」中的「.first」是什麼? – Padawan

+0

@Padawan'ARGV'是所有參數的數組(正如我在答案中鏈接的文檔中指出的那樣),所以'ARGV.first'獲得第一個參數。這裏使用的只是普通的['Array#first'](http://ruby-doc.org/core/Array.html#method-i- first)。 –

21

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 

這使得它很明顯是什麼參數,因爲他們的名字。

+0

總是知道歷史非常好,將它與變量名稱本身的可能起源相聯繫 –

12

考慮一些Ruby命令行工具,如rails,rake,gembundle。雖然這些都不是最終用戶應用程序(如Web應用程序或GUI應用程序),但它們仍然是用Ruby編寫的用戶交互的程序。他們都接受參數:

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

它可以使用ARGV來實現這些類型的接受參數的命令行程序。雖然我們經常使用OptionParser standard library或其他工具來實現此目的,但ARGV是這些工具構建於其上的低級集合。

所以,如果你曾經運行gemrailsrake,或bundle,或者是用Ruby編寫的任何命令行的開發工具,你會從ARGV受益匪淺!

4

ARGV的要點在於,它使腳本能夠在沒有人工輸入的情況下運行,並且還允許輸入可以在一次迭代到下一次迭代之間變化的情況。

例如,您可能正在運行三個不同的腳本來獲取三個值。然後可以將這些值傳遞給此腳本,並且可以使用ARGV來獲取這些選項的值。

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 [email protected] mypassword 

,並按下回車鍵。另外,我只需按下控制檯中的向上箭頭即可一次又一次運行它,或者使用不同名稱和密碼的最新版本快速測試腳本。

採取了一步,我做了,可以在多種組合

ruby my_script.rb [email protected] mypassword 
ruby my_script.rb [email protected] otherpassword 

最後運行此腳本,指定參數和所有shell腳本,有時我需要設置幾十個每個我跑了一次每設置腳本,然後多次運行該腳本。所以,我也可以很容易地插入幾十個變量到腳本的命令行

ruby my_script.rb option1 option2 option3 option4 

我很新的使用ARGV,希望更好地學習如何使用它,但是這是一個功能,我發現非常有用。