如何在 tcl 中取消设置 arg

How to unset an arg in tcl

我正在从命令行获取参数并将所有这些参数传递给另一个程序(使用 expect spawn)。我想解析所有选项并省略其中一些(或做其他事情)。为此,我正在这样做:

set arguments [lrange $argv 0 end]

#Check for -lp option. Set the program path 
for {set var 0} {$var<$argc} {incr var} {
    if {[lindex $arguments $var] == "-lp" || [lindex $arguments $var] == "--launcher-path"} {
        if {[lindex $arguments [expr {$var+1}]] != ""} {
            set program [lindex $arguments [expr {$var+1}]]
            #unset [lindex $arguments $var]
        } else {
            puts "E: Argument missing for option: [lindex $arguments $var]"
            exit 1
        }
    }
}

但我不知道如何取消设置我使用的那些参数。例如,我需要取消设置 [lindex $arguments [expr {$var+1}]][lindex $arguments $var].

我就是这样 运行 $program:

if {[catch {spawn $program --text {*}$arguments}]} {
    puts "E: Launcher not found: $program"
    exit 1
}

我是这样做的:

set arguments [lreplace $arguments [expr {$var+1}] [expr {$var+1}]]
set arguments [lreplace $arguments $var $var]

正如glenn-jackman所指出的,上面可以缩短为:

set arguments [lreplace $arguments $var [expr {$var+1}]]

如果你的参数都是 key-value,那么你可以用 foreach 成对地迭代参数,并建立一个只包含你感兴趣的参数的新列表。

set newarguments [list]
foreach {arg value} $arguments {
    switch -exact -- $arg {
        "-lp" -
        "--launcher-path" {
            set program $value
        }
        default {
            lappend newarguments $arg $value
        }
    }
}

如果您有混合标志和 key-value 选项,那么您将需要使用索引进行迭代,类似于您的代码,但构建新的参数列表将大致相同。

您也可以查看 tcllib cmdline package,尽管它不处理长选项。