<Problem>
When I went to use tcl re-write some tools writed by bash+getopt(1), I found that There is no satisfactory getopt in tcl:
cmdline.tcl in tcllib is so weak. just support '-opt', but can not support '--opt' others like getopt(1) always need write options name three times:
- in Usage info
- in getopt argument list
- in parse code
e.g.
Usage() {
echo "Usage: $prog [options] devname"
echo "-a desc of option a"
echo "-b desc of option b"
echo "-c, --ccc desc of option c"
}
_at=`getopt -o abc: \
--long ccc \
-n $prog -- "$@"`
eval set -- "$_at"
while true; do
case "$1" in
-a) aflag=a; shift 1;;
-b) bflag=b; shift 1;;
-c|--ccc) cflag=$2; shift 2;;
--) shift; break;;
esac
done
<Solved>
So I write a better tcl getopt that compat with GNU getopt_long_only(3), and easy to use.
https://github.com/tcler/getopt.tcl
https://github.com/tcler/getopt.tcl/blob/master/getOpt-1.0/example.tcl
you just need fill a options table.
example:
#!/bin/sh
# The next line is executed by /bin/sh, but not tcl \
exec tclsh "$0" ${1+"$@"}
lappend auto_path /usr/local/lib
package require getOpt 1.0
namespace import ::getOpt::*
# global var
array set Opt {}
array set InvalidOpt {}
set NotOptions [list]
set OptionList {
{*0} {Dummy {*Options:}}
{*1} {Dummy { *Options kkk1:}}
f {arg y help {#Specify a test list file}}
listf {arg y help {#Same as -f} link f}
cc {arg m help {#Notify additional e-mail address on job completion}}
{*2} {Dummy { *Options kkk2:}}
kcov {arg n help {#insert kcov task for do the kernel test coverage check}}
kdump {arg o help {#insert kdump task for get core dump file if panic happen}}
{*3} {Dummy { *Options kkk3:}}
debugi {hide y}
debugii {hide y}
h {}
}
# _parse_ argument
getOptions $OptionList $::argv Opt InvalidOpt NotOptions
parray Opt
parray InvalidOpt
puts "NotOptions: $NotOptions"
# getUsage test
puts "Usage: $argv0 \[options\]"
getUsage $OptionList