2014-06-11 57 views
2

我想傳遞的參數數組以這樣的方式假設process.rb是我的腳本和參數將是這樣的:紅寶石:在命令行參數傳遞數組

I/P

process.rb server{1..4} 
process.rb prodserver{2..3} 
process.rb devserver3 

process.rb應該接受所有的輸入,並以這種方式解析它,當我打印包含參數的變量時,給出下面的結果。

o/p 
    puts arguments 

    server1 
    server2 
    server3 
    server4 
    or 
    prodserver2 
    prodserver3 
    or 
    devserver3 

我有一個shell腳本,做同樣的:

for i in "[email protected]" 
do 
echo $i 
done 

i/p 
server{1..4} 
o/p 
server1server2server3server4 

我想有在紅寶石相同的邏輯。 由於我是一個紅寶石新bie,我無法在谷歌上找到相同的。 請讓我知道我能得到這個輸出,或對相關的任何物品,以我的問題

回答

2

如果我理解正確的話,你想擴展自帶以字符串形式從你的論點ARGV範圍[0]?我的樣品使用字符串來證明它workd,通過ARGV替換字符串[0]

def expand_range arg 
    string, range = arg.split("{") #split arg in string part and rangestring part 
    if range #if a range is given 
    # parse the rangestring to an range by splitting the string on .. 
    # and splash this array to both its elements, convert them to integer 
    # and transform into a real range 
    # and enumerate each number in the range 
    Range.new(*range.split("..").map(&:to_i)).each do |val| 
     #concatenate the string part with the number 
     p "#{string}#{val}" 
    end 
    else #else just pass the string 
    p string 
    end 
end 

expand_range 'server{1..4}' 
# "server1" 
# "server2" 
# "server3" 
# "server4" 

expand_range 'devserver3' 
#"devserver3" 

我個人返回數組和打印,而不是在方法本身印刷,這將是多種多官能這一點。

+0

這是完美的男人非常感謝。 也可以請你介紹一下2-4行之間會發生什麼。 –

+0

確定:我會將其廣告給我的回答 – peter

+0

謝謝你,上帝保佑你:) –

3
#!ruby 

ARGV.each do |i| 
    puts i 
end 

基本上ARGV持有傳遞給程序的所有參數,並puts打印字符串新行添加(同爲echo沒有-n shell中的標誌)。

+0

對不起,說錯了。讓我再次向你解釋我所期待的。假設我有12個服務器名稱server1,2,3 .... 12 ,我想在e.x的索引參數中傳遞服務器名稱。 我/ p 服務器{1..5} 比我應該將server1,server2,server3,server4,server5作爲變量中的值。 考慮另一個例子。 I/P: server {3 ..3} 比我會得到server3只有 I/P 服務器{1..2,5..9} 比我會得到server1,server2,server5,server6,server7 server8,server9。 我認爲這些例子會幫助你理解問題 –

+1

@ A_01所以你在'{}'中傳遞範圍,** shell **默認**展開**,顯示利用這種自動擴展的例子,正如我理解你的作品,但顯然不是你的新例子,但你想要別的嗎?那麼是的,我的回答是不正確的。 – MBO

+0

這是正確的,用'process.rb server {1..4}'調用你的腳本將傳遞4個參數並將'ARGV'設置爲'[「server1」,「server2」,「server3」,「server4」]' – Stefan

3

Ruby中的命令行參數最終在ARGV。您可以通過遍歷該複製你的shell腳本的功能:

ARGV.each do |a| 
    puts a 
end 
+0

謝謝4回覆。但不幸的是你的anser是不正確的。 如果你正確地閱讀了這個問題,你會明白我期待的是什麼o/p。對不起,說你回答incrorect –

+2

'完成'應該'結束' – Stefan

+0

哎呀,謝謝。固定。當你被迫從Ruby切換到Python一年時會發生這種情況。 :) –

5

該列表在shell遇到您的腳本之前由其進行擴展。換句話說,無論你的shell腳本和你的Ruby腳本收到一個參數server{1..4}而是他們收到參數server1 server2 server3 server4他們甚至開始解釋參數本身。

你可以簡單地遍歷這些,沒有必要自己解析{1..4} shell擴展語法,因爲你會從來沒有看到它!它已經在之前通過shell 解析和擴展,shell將腳本的參數傳遞給腳本。

ruby -e 'p ARGV' -- server{1..4} 
# ["server1", "server2", "server3", "server4"]