Ruby 将数组作为命令参数传递

Ruby 将数组作为命令参数传递,ruby,bash,shell,command-line,arguments,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 jruby test.rb [1, 2]

我试图从命令行将数组传递给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
jruby test.rb [1, 2], 3, [5, 6], 8
String
"[1,"
91
String
"2],"
50
到目前为止一切都很好。现在,我将脚本更改为从命令行接受参数:

require 'pp'

def foo(arr1,var)
  puts arr1.class
  pp arr1
  pp arr1[0]
end
foo ARGV[0],3
以下是输出:

Array
[1, 2]
1
Array
[5, 6]
5
jruby test.rb [1, 2], 3, [5, 6], 8
String
"[1,"
91
String
"2],"
50
如您所见,数组作为字符串传递,arr[0]基本上打印ascii值

所以问题是如何从命令行传递数组,最好是一行。 我还相信这个问题与所有shell调用有关,而不仅仅是ruby

我正在使用bashshell

更新: 刚刚更新了问题,指出在不同的位置可以有多个数组

这里有一些方法可以实现这一点。远离基于
eval
的解决方案。我最喜欢的(虽然我不知道ruby,但这是我最喜欢的:

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]

参数总是以字符串形式出现,您需要找到一种方法将它们转换为您想要的格式,在您的示例中是一个值数组,后跟一个值。为此,我建议使用,以减轻处理参数的负担。它可以接受多值参数,例如

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
$ruby test.rb——帮助
选项:
--数组,-a:数组
--val,-v:一个值
--帮助,-h:显示此消息

您可以使用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

希望对你有所帮助。这看起来是个有趣的选择。但是我遇到了一些语法错误,doc没有清楚地解释我的选择。语法错误,意外的“:”opt:array,'an array',type::ints=========================我还更新了我的问题,使它更有趣clear@codeObserver:您正在使用旧版本的Ruby。新版本语法是在Ruby 1.9.0.Thnx.Christian中引入的。我试图从shell而不是irb调用它。看起来eval是唯一的选项。好的,您可以使用最后两行代码来实现这一点,因为它是一个字符串。Thanx Edu。我传递的数组是一个字符串数组,具体来说是文件路径。如果您愿意,我将非常感谢可以给出正确的语法来传递字符串数组,比如:jruby test.rb[“path1”,“path2”]、3、[“name1”,“name2”]、8Adding“并对它们进行转义。jruby test.rb[\“path1\”,“path2\”],3、[\“name1\”,“name2\”],8..Thnx,这对我很有效!嗨,codeObserver,您可以将eval更改为:eval(“foo”+ARGV.join(“).gsub(/(\w+/,“\1””),因此不需要逃避传递参数。如果要包含\和/:-,则此求值(“foo”+ARGV.join(“”).gsub(/([\w\\\\/]),““\1”))