我想以这样的方式在参数中传递数组假设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,我无法在谷歌上找到相同的。 请让我知道如何获得此输出或任何与我的问题相关的文章
答案 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"
就个人而言,我会返回一个数组并打印出来而不是在方法本身中打印,这样会更加多功能。