Ruby:在命令行参数中传递数组

时间:2014-06-11 20:24:35

标签: ruby-on-rails ruby unix command-line-parsing

我想以这样的方式在参数中传递数组假设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 "$@"
do
echo $i
done

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

我想在红宝石中使用相同的逻辑。 由于我是红宝石的新bie,我无法在谷歌上找到相同的。 请让我知道如何获得此输出或任何与我的问题相关的文章

4 个答案:

答案 0 :(得分:5)

在shell命中脚本之前,shell会对列表进行扩展。换句话说,你的shell脚本和你的Ruby脚本都不会收到一个参数server{1..4},而是接收四个参数server1 server2 server3 server4,< em>之前他们甚至开始自己解释参数。

你可以简单地迭代这些,不需要自己解析{1..4} shell扩展语法,因为你永远不会看到它!在 shell将脚本的参数传递给脚本之前,它已经被shell 解析和扩展。

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

答案 1 :(得分:3)

#!ruby

ARGV.each do |i|
  puts i
end

基本上ARGV包含传递给程序的所有参数,puts打印添加了新行的字符串(与echo相同,但在shell中没有-n标志。)

答案 2 :(得分:3)

Ruby中的命令行参数最终在ARGV。您可以通过迭代来复制shell脚本的功能:

ARGV.each do |a|
    puts a
end

答案 3 :(得分:2)

如果我理解正确,你想从你的论点ARGV [0]扩展字符串形式的范围?我的样本使用字符串来演示它的工作原理,用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"

就个人而言,我会返回一个数组并打印出来而不是在方法本身中打印,这样会更加多功能。