getopt
, optind
, optindc
- parse command-line options in TCL
getopt arglist optstring optret argret
getopt
sets the variable optret
to the next option letter in arglist
that matches a letter in optstring
. optstring
must contain the option letters the command using getopt
will recognize; if a letter is followed by a colon, the option is expected to have an argument. The variable argret
will be set to the option argument, if any.
getopt
sets the global variables optind
and optindc
to point to the next option letter in arglist
to be processed; optind
holds the index of the option in the list, and optindc
holds the index of the option letter in the string.
When all options have been processed (that is, up to the first non-option argument), getopt
returns an empty string. The special option --
may be used to delimit the end of the options; when it is encountered, optret
will be set to the empty string, and the --
will be skipped.
If getopt
encounters an option in arglist
that is not described in optstring
, or it finds an option with no argument when the option requires one, it sets optret
to a blank string and argret
to an error message.
getopt
returns 1
if an option was found, 0
if no more options were found, and -1
if an error occurred.
The following script accepts the exclusive options -a
and -b
, and the option -o
with an argument.
#!/usr/local/bin/tclsh set opts(a) 0 set opts(b) 0 set opts(o) "" proc usage {} { puts stderr "Usage: $argv0 [ -a | -b ] [ -o <string> ]" exit 22 } while { [ set err [ getopt $argv "abo:" opt arg ]] } { if { $err < 0 } then { puts stderr "$argv0: $arg" usage } else { switch -exact $opt { a { if { $found(b) } then { puts stderr "$argv0: Only one of -a and -b may be specified!" usage } else { set found(a) 1 } } b { if { $found(a) } then { puts stderr "$argv0: Only one of -a and -b may be specified!" usage } else { set found(b) 1 } } o { set found(o) $optarg } } } } set argv [ lrange $argv $optind end ] if { $found(a) } then { puts stdout "Found option -a" } if { $found(b) } then { puts stdout "Found option -b" } if { [ string length $found(o) ] } then { puts stdout "Found option -o: } puts -nonewline stdout "The rest of the arguments are: " set prefix "" foreach arg $argv { puts -nonewline stdout "$prefix set prefix ", " } puts stdout ""
http://www.waxandwane.org/toolbox/tclGetOpts/
Ross Palmer Mohn (rpmohn at waxandwane dot org), Johnson Earls (darkfox at springhaven dot org)
Changing the value of the variable optind
, or calling getopt
with a different arglist
, may lead to unexpected results.