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]

confCmdsで変数置換を行うためにsubstを使用できるので、私は(ほぼ)言いますが、それは本当にあなたが望むものではなく、それは危険に満ちています。必要なのは単語のリストで、そのうちの1つ以上を変数で定義できます。それはまさに上記の解決策があなたに与えるものです。

必要に応じて、円記号を使用してコマンドを複数行に広げることができます。

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

このソリューションは、必要なのがtclリストであることを前提としています。これはあなたが望むものであるかもしれないし、そうでないかもしれません、それはすべてあなたがこのデータを下流でどのように扱うかに依存します。

コメントで、本当に必要なのは改行で区切られた項目の文字列であると書きました。この場合、たとえば、二重引用符を使用できます。

set confCmds "
    command1
    command2
    $cmd_ts
"

これにより、改行で区切られた複数の行を持つ文字列が得られます。$ cmd_tsの内容によっては失敗する可能性があるため、これをコマンドのリストとして扱わないように注意してください(つまり、'foreach foo $ confCmds'を実行しないでください)。

于 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 に答える