Когда вы запускаете скрипт на 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