我正在解析Tcl中的命令行参数。与在参数列表中声明它们的方式相比,这些参数是不正常的(我实际上是在调用expect,但它到目前为止只有Tcl):
# cmdline package to handle arguments
package require cmdline
# set parameters
set parameters {
{apk.arg "" "apk file"}
{apkdirfrom.arg "" "apk from dir"}
{apkdirto.arg "" "apk to dir"}
{pkg.arg "" "package"}
{mainclass.arg "" "main class"}
{monkey.arg "" "monkeyrunner script"}
{remotehost.arg "" "remote host"}
{remoteuser.arg "" "remote user"}
{logdir.arg "" "log dir"}
{timeout.arg "" "timeout"}
{disable-uninstall.arg "" "unimplemented: disable uninstall. 0 disable is off, 1 disable is on."}
}
array set arg [cmdline::getoptions argv $parameters]
然而,这个命令并没有奏效。我想我可能会按照与此处显示的顺序略有不同的顺序调用它们。事实上,使用Mac的Tcl和Window的Cygwin Tcl,这些假设似乎是正确的。但是,使用Ubuntu 12.04 Linux时,这个假设被证明是不正确的。他们需要按照特定的顺序。
这是有效的顺序:
#set parameters
set parameters {
{apk.arg "" "apk file"}
{apkdirfrom.arg "" "apk from dir"}
{apkdirto.arg "" "apk to dir"}
{pkg.arg "" "package"}
{mainclass.arg "" "main class"}
{monkey.arg "" "monkeyrunner script"}
{remotehost.arg "" "remote host"}
{remoteuser.arg "" "remote user"}
{timeout.arg "" "timeout"}
{disable-uninstall.arg "" "unimplemented"}
{logdir.arg "" "log dir"}
}
array set arg [cmdline::getKnownOptions argv $parameters]
也就是说,日志目录似乎没问题。
你知道订单是否重要吗?我认为它没有,但似乎确实如此。
无论如何,在Mac上我发现我们正在使用tcllib 1.12而在Ubuntu 12.04上我们正在使用tcllib 1.14。我试图换掉cmdline库,但那不起作用。我认为在Windows上它可以工作,因为我从mac复制了cmdline,这才有用。
如果有人能对这个问题有所了解,那将会有所帮助。
如果你能推荐一些更简单的东西(一个替代的命令行解析器),那就太好了。
答案 0 :(得分:0)
作为cmdline
的替代方案,dict
可以用于您的选项处理(因为您的所有参数都是带值的选项)。
您可以使用以下默认值设置选项列表:
set options [dict create \
-apk "" \
-apkdirfrom "" \
-apkdirto "" \
-pkg "" \
-mainclass "" \
-monkey "" \
-remotehost "" \
-remoteuser "" \
-logdir "" \
-timeout "" \
-disable-uninstall "" \
]
和这样的使用文档字典:
set optionsUsage [dict create \
-apk "apk file" \
-apkdirfrom "apk from dir" \
-apkdirto "apk to dir" \
-pkg "package" \
-mainclass "main class" \
-monkey "monkeyrunner script" \
-remotehost "remote host" \
-remoteuser "remote user" \
-logdir "log dir" \
-timeout "timeout" \
-disable-uninstall "unimplemented: disable uninstall. 0 disable is off, 1 disable is on." \
]
您可以使用以下命令打印用法消息:
proc printUsage optionsUsage {
set maxlen 0
dict for {opt -} $optionsUsage {
set len [string length $opt]
if {$len > $maxlen} { set maxlen $len }
}
dict for {opt use} $optionsUsage {
puts [format "%-${maxlen}s %s" $opt $use]
}
}
在您的命令中,您可以设置实际的选项值,如下所示:
set actualOptions [dict merge $::options $args]
(好吧,如果你想直接阅读这本书,你可以这样做:)
set actualOptions [dict merge $::options [dict create {*}$args]]
您可以像这样查询选项字典:
dict get $actualOptions -monkey
您可以获得以下选项的具体用法:
dict get $::optionsUsage -monkey