3

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

这是我试过的..

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

但不是得到

confCmds = 
    command1
    command2
    foo bar

我正进入(状态:

confCmds =
    command1
    command2
    $cmd_ts

PS我尝试了以下无济于事

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

3 回答 3

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 中的内容。

于 2009-05-12T10:49:06.493 回答
4

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

如果您想对命令做任何有用的事情,您可能希望将它们作为一个列表,但如果您只想将它​​们用新行分隔,请在最后执行以下操作:

set confCmds [join $confCmds "\n"]
于 2009-05-12T15:43:51.893 回答
2

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

subst $confCmds
于 2009-05-12T17:13:04.947 回答