我正在尝试使用可能(或不存在)的参数生成进程。我的实际代码如下所示:
set optionalParam ""
if { somecondition } {
set optionalParam someValue
}
spawn foo.sh paramA paramB "param C" $optionalParam
somecondition
为false时会出现问题。 foo.sh
会看到一个附加参数,其值为空(如""
)。
这样做的正确方法是什么?
答案 0 :(得分:4)
有多种正确的方法可以做到这一点。就个人而言,我将所有参数放入一个列表中,然后在最后展开列表:
set params {paramA paramB "param C"}
if { somecondition } {
lappend params someValue
}
spawn foo.sh {*}$params
如果您愿意,可以使用字符串执行相同的操作。
答案 1 :(得分:1)
如果你有Tcl 8.5或更高版本,你肯定应该使用扩展替换:
set optionalParam [list]
if { somecondition } {
lappend optionalParam someValue
}
spawn foo.sh paramA paramB "param C" {*}$optionalParam
在8.4及之前,你被迫使用这样的东西:
set optionalParam [list]
if { somecondition } {
lappend optionalParam someValue
}
eval [list spawn foo.sh paramA paramB "param C"] $optionalParam
这显然容易出错并且啰嗦,许多Tclers倾向于使用像
这样的快捷方式set optionalParam ""
if { somecondition } {
set optionalParam someValue
}
eval spawn foo.sh paramA paramB paramC $optionalParam
尽管如此,这对于"param C"
来说会“有趣”失败。或者如果真实someValue
中有空格。 (尝试为自己解决原因!如果你能在没有使用Tcl解释器的情况下完成它,请考虑自己有一个奖励点。)正是由于这些麻烦,我们在Tcl 8.5中添加了扩展语法,这是非常更容易做对。