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
флаг в оболочке).