I make a lot of little command line utility programs as I hack on things, but usually I need to pass in some sort of flag or argument into it.
I usually just use the ARGV array like so:
name = ARGV[0]
age = ARGV[1]
but sometimes we want to skip the first argument and only provide the second one which can be tricky to do if we only rely on the ARGV array.
Ruby has the optparse library as part of the standard library which means we need to require it, but it won’t actually install an external gem for it.
require 'optparse'
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: app.rb [options]"
opts.on("-n", "--name=NAME", "First name of user") do |n|
args[:name] = n
end
opts.on("-a", "--age=AGE", "Age of user") do |a|
args[:age] = a
end
end.parse!
if args[:name]
puts "NAME: #{args[:name]}"
end
if args[:age]
puts "AGE: #{args[:age]"
end
Now if you run the app with the -h
flag it will print out the options for you for free:
ruby app.rb -h
Usage: app.rb [options]
-n, --name=NAME First name of user
-a, --age=AGE Age of user
We can run our app now and pass in just a single argument without having to worry about the order like we did when we relied on ARGV
ruby app.rb -a 34
AGE: 34