2013-10-24 42 views
1

我想學習ruby腳本。目前,我創建一個腳本這應該接受用戶輸入並做類似下面的一些行動:如何解析用戶輸入的紅寶石腳本

Go to server1 and restart mysqld 

下面是我的腳本:

#!/usr/bin/ruby 

puts "on which environment you want to run the script?" 
srenv = STDIN.gets.chomp() 
puts "#{srenv}" 

puts "Hi you have chosen to run the script on #{srenv}, now is it Cluster or not?" 
srenvdl = STDIN.gets.chomp() 
puts "#{srenvdl}" 

if srenvdl == "y" 
    text = String.new 
    File.open("cluster.txt") { |f| text = f.read } 
    words = text.split(/[^a-zA-Z1-9]/) 
    puts "Now enter your services names:" 
    sernm = STDIN.gets.chomp() 
    sernmw = sernm.split(/[^a-zA-Z1-9]/) 
    for x in words 
     for each in sernmw 
      puts "Go to #{x} and restart #{each}!!" 
     end 
    end 
else 
    puts "Sorry now we are only supporting Clusters." 
    exit 
end 

這是一個互動的腳本,它要求用戶輸入服務名稱並從我想跳過的文件中讀取羣集服務器名稱。另外,我無法在從文件讀取時跳過羣集名稱。

ruby script.rb cluster1:mysqld,nginx cluster2:memcache,sendmail 

我有,我已經存儲瞭如下的集羣服務器名anoter文件cluster.txt:

cluster1:server1,server11,server111 
cluster2:server2,server22,server222 

現在我希望腳本應該返回我的結果是象下面這樣:

Go to server1 and restart mysqld 
Go to server1 and restart nginx 
Go to server11 and restart mysqld 
Go to server11 and restart nginx 
Go to server111 and restart mysqld 
Go to server111 and restart nginx 
Go to server2 and restart memcache 
Go to server2 and restart sendmail 
Go to server22 and restart memcache 
Go to server22 and restart sendmail 
Go to server222 and restart memcache 
Go to server222 and restart sendmail 
+1

那麼,那有什麼問題呢? –

+0

其實我不想交互,其次是從cluster.txt讀取時不能跳過clustername。 – linuxnewbee

回答

2

您可能會遇到這種情況,您需要將其中帶有空格的參數傳遞給Ruby程序。起初,這似乎是不可能的,因爲shell將空間的論據分開。但是,有一個規定:雙引號中的任何參數不會被分開。在將雙引號傳遞給Ruby程序之前,雙引號將被shell刪除。以下示例將一個參數傳遞給test.rb Ruby腳本test1 test2。

$ ./test.rb "test1 test2" 

使用命令行參數

在你的Ruby程序,您可以通過訪問與ARGV特殊變量外殼傳遞的命令行參數。 ARGV是一個數組變量,它作爲字符串保存shell傳遞的每個參數。以下程序在ARGV數組上進行迭代並打印出其內容。

#!/usr/bin/env ruby 

ARGV.each do|a| 
    puts "Argument: #{a}" 
end 

以下是使用各種參數啓動此腳本(保存爲文件test.rb)的bash會話的摘錄。

$ ./test.rb test1 test2 "three four" 
Argument: test1 
Argument: test2 
Argument: three four