使用tcl cmdline包(tcllib1.1.2和1.1.4)

时间:2013-09-19 20:33:39

标签: tcl

我正在解析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,这才有用。

如果有人能对这个问题有所了解,那将会有所帮助。

如果你能推荐一些更简单的东西(一个替代的命令行解析器),那就太好了。

1 个答案:

答案 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