2009-05-12 5 views
3

Мне нужно использовать значение переменной внутри другой переменной.В 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

ответ

9

(почти) ничего не будет работать до тех пор, вы используете фигурные скобки. Лучшее предложение использовать команду списка:

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.

+0

на самом деле я хочу command1, command2 и $ cmd_ts быть разделены новым line, но используя список или concat, я получаю их вместе в виде строки с разделителями пробелов.Любая идея, как достичь этого, когда я сталкиваюсь с трудным временем решения \ n: P –

+2

Вы можете использовать двойные кавычки вместо фигурных скобок в вашем исходном примере. Пока вы не будете рассматривать эти данные как список Tcl, все будет в порядке. Другим вариантом является преобразование только что созданного списка tcl в строку элементов, разделенных новой строкой, с помощью [join $ confCmds \ n] –

4

Ответ Брайана хорош, кроме опечатки, которую я не могу исправить с моим представителем. (список в первой команде должен заканчиваться квадратной скобкой).

Если вы хотите сделать что-нибудь полезное с командами, вы, вероятно, хотите их список, но если вы просто хотите, чтобы они отделены друг от друга новой линии сделать это в конце:

set confCmds [join $confCmds "\n"] 
+0

спасибо за указание опечатки. Я исправил это. –

2

Если вы должны есть список, определенный, как вы есть, вы можете также использовать команду SUBST, который будет выполнять замену, что фигурные скобки предотвращающий:

subst $confCmds 
Смежные вопросы