将数组作为命令参数传递

时间:2012-03-08 07:37:02

标签: ruby bash shell command-line arguments

我正在尝试从命令行将数组传递给ruby脚本并面临一些问题。

问题在于:

require 'pp'

def foo(arr1, var, arr2, var2)
  puts arr1.class
  pp arr1
  pp arr1[0]
  puts arr2.class
  pp arr2
  pp arr2[0]
end

foo [1, 2], 3, [5, 6], 8

这是输出:

Array
[1, 2]
1
Array
[5, 6]
5
到目前为止一切都很好。现在我将脚本更改为从命令行接受参数:

require 'pp'

def foo(arr1,var)
  puts arr1.class
  pp arr1
  pp arr1[0]
end
foo ARGV[0],3

这是输出:

jruby test.rb [1, 2], 3, [5, 6], 8
String
"[1,"
91
String
"2],"
50

如您所见,数组作为字符串传递,arr [0]基本上打印ascii值。

所以问题是我如何从命令行传递一个数组,希望在一行中。 另外我相信这个问题与所有shell调用有关,而不仅仅是ruby?

我正在使用bash shell。

更新: 刚刚更新了问题,表明在不同的位置可以有多个阵列

3 个答案:

答案 0 :(得分:2)

这是完成此任务的list方法。远离基于eval的解决方案。我最喜欢的(虽然我不知道红宝石,但这是我最喜欢的:

irb(main):001:0> s = "[5,3,46,6,5]"
=> "[5,3,46,6,5]"
irb(main):002:0> a = s.scan( /\d+/ )
=> ["5", "3", "46", "6", "5"]
irb(main):003:0> a.map!{ |s| s.to_i }
=> [5, 3, 46, 6, 5]

答案 1 :(得分:2)

参数将始终以字符串形式出现,您需要找到一种方法将它们转换为您想要的格式,在您的示例中是一个值数组,后跟一个值。我建议使用trollop来解决这个问题。它可以接受多值参数,例如

require 'trollop'

opts = Trollop.options do 
    opt :array, 'an array', type: :ints
    opt :val, 'a value', type: :int
end

puts "array: #{opts[:array].inspect}"
puts "val: #{opts[:val].inspect}"

然后你可以这样做:

$ ruby test.rb -a 1 2 -v 3
array: [1, 2]
val: 3

非常好:

$ ruby test.rb --help
Options:
 --array, -a <i+>:   an array
 --val, -v <i>:   a value
 --help, -h:   Show this message

答案 2 :(得分:0)

虽然您可能会打开一个安全漏洞,但您可以使用eval:

require 'pp'

def foo(arr1, var, arr2, var2)
  puts arr1.class
  pp arr1
  pp arr1[0]
  puts arr2.class
  pp arr2
  pp arr2[0]
end

eval("foo " + ARGV.join(" "))

结果

Array
[1, 2]
1
Array
[5, 6]
5

希望有所帮助