在TCL中,如何使变量使用另一个变量的值

时间:2009-05-12 10:39:31

标签: tcl

我需要在另一个变量中使用变量的值。

这就是我试过的......

set cmd_ts "foo bar"
set confCmds {
    command1
    command2
    $cmd_ts
}
puts "confCmds = $confCmds"

但不是

confCmds = 
    command1
    command2
    foo bar

我得到了:

confCmds =
    command1
    command2
    $cmd_ts

P.S。我尝试了以下无济于事

  1. $ cmd_ts
  2. “$ cmd_ts”
  3. {$ cmd_ts}
  4. \ $ cmd_ts

3 个答案:

答案 0 :(得分:9)

(几乎)只要你使用花括号就什么都行不通。最好的建议是使用list命令:

set confCmds [list command1 command2 $cmd_ts]

我说(差不多)因为你可以使用subst来对confCmds进行变量替换,但这并不是你想要的,而是充满了危险。你想要的是一个单词列表,其中一个或多个可以由变量定义。这正是上述解决方案为您提供的。

如果需要,可以使用反斜杠在多行上传播命令:

set confCmds [list \
    command1 \
    command2 \
    $cmd_ts \
]

此解决方案假定您想要的是tcl列表。这可能是您想要的,也可能不是,这一切都取决于您如何处理下游的这些数据。

在评论中你写道,你真正想要的是一串换行符号,在这种情况下你可以使用双引号,例如:

set confCmds "
    command1
    command2
    $cmd_ts
"

这将为您提供一个由换行符分隔的多行的字符串。小心尝试将其视为命令列表(即:不要'foreach foo $ confCmds'),因为它可能会失败,具体取决于$ cmd_ts中的内容。

答案 1 :(得分:4)

布莱恩的回答很好,除了一个错字,我无法解决我的代表。 (第一个命令中的列表应以方括号结束)。

如果你想对这些命令做任何有用的事情,你可能希望它们作为一个列表,但如果你只是想让它们用一个新行分隔,那么最后这样做:

set confCmds [join $confCmds "\n"]

答案 2 :(得分:2)

如果必须按照自己的方式定义列表,还可以使用subst命令,该命令将执行大括号阻止的替换:

subst $confCmds