我需要在另一个变量中使用变量的值。
这就是我试过的......
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。我尝试了以下无济于事
答案 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