Когда вы запускаете скрипт на Ruby, то можете указать любые значения в командной строке после имени скрипта:
Например:
ruby code.rb abc.txt def.txt qqrq.txt
или вот так:
ruby code.rb Hello --machine big -d -tl
Вопрос в том, как программа на Ruby понимает, что передано в командной строке.
Ruby предоставляет массив ARGV
со значениями из командной строки.
Мы можем получить доступ к элементам этого массива так же, как и в случае любого другого массива:
ARGV[0]
это первое значение после имени скрипта.
Мы можем обойти все элементы либо с помощью цикла for
:
examples/ruby/command_line_argv.rb
for arg in ARGV
puts arg
end
либо с помощью диапазона индексов, получая элементы по индексу.
examples/ruby/command_line_argv_with_index.rb
for i in 0 ... ARGV.length
puts "#{i} #{ARGV[i]}"
end
$ ruby command_line_argv_with_index.rb foo bar --machine big
0 foo
1 bar
2 --machine
3 big
Проверка количества аргументов
Для простой валидации переданных значений мы можем проверить длину массива ARGV
.
И если мы получили недостаточно аргументов, то сообщить об этом и преждевременно завершить работу программы.
examples/ruby/command_line_argv_check_length.rb
if ARGV.length < 2
puts "Too few arguments"
exit
end
puts "Working on #{ARGV}";
Запустив скрипт, мы получим:
$ ruby command_line_argv_check_length.rb one
Too few arguments
$ ruby command_line_argv_check_length.rb one two
Working on ["one", "two"]
Значения из командной строки имеют тип строка
Во фрагменте кода мы сначала проверяем, получили ли мы точно 2 параметра, и если да, то суммируем их:
examples/ruby/command_line_argv_add.rb
if ARGV.length != 2
puts "We need exactly two arguments"
exit
end
puts ARGV[0] + ARGV[1]
ruby command_line_argv_add.rb 23 19
2319
Результат вас не удивит, если вы знаете, что переданные в командную строку значения, приходят в программу как строки.
Даже если это на самом деле числа. Если мы хотим использовать их как числа, то нужно их сконвертировать с помощью to_i
:
$ ruby command_line_argv_add_numbers.rb 23 19
42