It's relatively easy to parse the command line by hand if you aren't looking for anything too complex:
# Naive error checking
abort('Usage: ' + $0 + ' site id ...') unless ARGV.length >= 2
# First item (site) is mandatory
site = ARGV.shift
ARGV.each do | id |
# Do something interesting with each of the ids
end
But when your options start to get more complicated, you probably will need to use an option parser such as, well, OptionParser:
require 'optparse'
# The actual options will be stored in this hash
options = {}
# Set up the options you are looking for
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{$0} -s NAME id ..."
opts.on("-s", "--site NAME", "Site name") do |s|
options[:site] = s
end
opts.on( '-h', '--help', 'Display this screen' ) do
puts opts
exit
end
end
# The parse! method also removes any options it finds from ARGV.
optparse.parse!
There's also a non-destructive parse
, but it's a lot less useful if you plan on using the remainder of what's in ARGV
.
The OptionParser class doesn't have a way to enforce mandatory arguments (such as --site
in this case). However you can do you own checking after running parse!
:
# Slightly more sophisticated error checking
if options[:site].nil? or ARGV.length == 0
abort(optparse.help)
end
For a more generic mandatory option handler, see this answer. In case it isn't clear, all options are optional unless you go out of your way to make them mandatory.