1

我在 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 {
    {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,并且它可以工作。

如果有人可以对这个问题有所了解,那将很有帮助。

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

4

1 回答 1

0

作为 , 的替代方法cmdlinedict可以用于您的选项处理(因为您的所有参数都是带值的选项)。

您使用默认值设置选项列表,如下所示:

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
于 2014-01-18T22:07:05.690 回答