views:

405

answers:

1

I don't know ruby very well, but I'm trying to add some functionality to this script a co-worker wrote.

Basically right now it takes a few flags and standard in as input, and it uses OptionParser to parse the flags.

I want to use OptionParser to parse a selection of command line arguments similar to those of cat. So I guess my question is how would I write the command line options parsing part of cat in ruby using OptionParser

cat [OPTION]... [FILE]...

Hope that makes sense, any help is appreciated.

+2  A: 
OPTS = {}

op = OptionParser.new do |x|
    x.banner = 'cat <options> <file>'      
    x.separator ''

    x.on("-A", "--show-all", "Equivalent to -vET")               
        { OPTS[:showall] = true }      

    x.on("-b", "--number-nonblank", "number nonempty output lines") 
        { OPTS[:number_nonblank] = true }      

    x.on("-x", "--start-from NUM", Integer, "Start numbering from NUM")        
        { |n| OPTS[:start_num] = n }

    x.on("-h", "--help", "Show this message") 
        { puts op;  exit }

end

op.parse!(ARGV)

# Example code for dealing with filenames
ARGV.each{ |fn| output_file(OPTS, fn) }

I shall leave other command line operations, as they say, as an exercise for the reader! You get the idea.

(NB: I had to invent a fictional -x parameter to demo passing a value after a flag.)

Update: I should have explained that this will leave ARGV as an array of filenames, assuming that the user has entered any.

Shadowfirebird
So the issue with this is it supports only one file. What I'm really trying to figure out is how to deal with the fact that there is 4 files on command line. Lets say a call like "cat a.txt b.txt c.txt d.txt".
icco
Nope, ARGV should be an array with one element for each word left on the command line after the options are processed. In your example it would have four elements.
Shadowfirebird
@icco `puts ARGV.inspect # => ["a.txt", "b.txt", "c.txt", "d.txt"]`
Myrddin Emrys