Mandatory and optional command line options

suggest change

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.

Feedback about page:

Feedback:
Optional: your email if you want me to get back to you:



Table Of Contents