Ruby: передать массив в аргументе командной строки

Я хочу передать массив в аргументе таким образом, предположим, что 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

У меня есть сценарий оболочки, который делает то же самое:

for i in "$@"
do
echo $i
done

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

Я хотел иметь ту же логику в рубине. Так как я новичок в рубине, я не могу найти то же самое в Google. Пожалуйста, дайте мне знать, как я могу получить этот вывод или любую статью, связанную с моим вопросом

4 ответа

Решение

Если я вас правильно понимаю, вы хотите расширить диапазон, представленный в виде строки, из вашего аргумента 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"

Лично я бы возвратил массив и напечатал бы, что вместо печати в самом методе, это было бы более многофункциональным.

Список расширяется оболочкой еще до того, как он попадет в ваш скрипт. Другими словами, и ваш скрипт оболочки, и ваш скрипт Ruby не получают ни одного аргумента server{1..4} а они получают четыре аргумента server1 server2 server3 server4 прежде, чем они даже начнут интерпретировать аргументы сами.

Вы можете просто перебрать их, нет необходимости разбирать {1..4} Синтаксис расширения оболочки самостоятельно, потому что вы никогда его не увидите! Он уже анализируется и раскрывается оболочкой, прежде чем оболочка передает аргументы вашему сценарию.

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

Аргументы командной строки в Ruby заканчиваются в ARGV, Вы можете дублировать функциональность вашего скрипта, повторяя это:

ARGV.each do |a|
    puts a
end
#!ruby

ARGV.each do |i|
  puts i
end

В принципе ARGV содержит все аргументы, переданные в программу, и puts печатает строку с добавленной новой строкой (так же, как echo без -n флаг в оболочке).

Другие вопросы по тегам