2014-06-11 32 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"]