我从命令行获取参数并将所有这些参数传递给另一个程序(使用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
}
}
}
但我无法弄清楚如何取消我使用的那些args。例如,我需要取消设置[lindex $arguments [expr {$var+1}]]
和[lindex $arguments $var]
。
这就是我运行$program
:
if {[catch {spawn $program --text {*}$arguments}]} {
puts "E: Launcher not found: $program"
exit 1
}
答案 0 :(得分:1)
如果你的参数都是键值,那么你可以用foreach
成对遍历参数,并建立一个新的列表,其中只包含你感兴趣的参数。
set newarguments [list]
foreach {arg value} $arguments {
switch -exact -- $arg {
"-lp" -
"--launcher-path" {
set program $value
}
default {
lappend newarguments $arg $value
}
}
}
如果你有混合标志和键值选项,那么你需要使用索引进行迭代,类似于你的代码,但是建立新的参数列表将大致相同。
你也可以检查tcllib cmdline
package,虽然这不能处理长选项。
答案 1 :(得分:0)
我就是这样做的:
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}]]