如何在TCL处理之前防止替换?

时间:2017-10-05 04:24:48

标签: tcl command-substitution

我正在调用这样的TCL程序 -

::f::abstract -procname my_proc -args "-arg1 $a -arg2 $b"

现在$a本身就是这样 -

"ping -c 1 10.1.1.$ip"

当我尝试运行此功能时,$a会展开,然后变为 -

-args "-arg1 ping -c 1 10.1.1.27 -arg2 a2"

这会产生错误,因为现在看来我们还有其他参数,例如-c。

我想要的是整体地接受$a,然后在程序中扩展它。

我该怎么做?

我无法使用{}括号,因为我需要变量替换。我无法删除引号,因为外引号会引入args

2 个答案:

答案 0 :(得分:2)

怎么样

::f::abstract -procname my_proc -args [list -arg1 $a -arg2 $b]

它允许替换但保留命令行的列表结构。即你在每个级别上仍然拥有相同数量的参数。

答案 1 :(得分:2)

欢迎引用恐怖行为。

如果您在程序中正确展开它,请将其视为正确的列表:

::f::abstract -procname my_proc -args [list -arg1 $a -arg2 $b]

这会像你期望的那样传递给你的过程:作为四件事:

  • 字符串-arg1
  • 列表/脚本ping - c1 10.1.1.$ip
  • 字符串-arg2
  • 字符串<无论$b扩展为>

在你的proc中,你将不得不再次eval你的arg1的'a'值,就像你期望的那样(我希望你的结构中有多个评估)。

proc ... args {
    array set options <defaults>
    array set options $args
    set a [uplevel 1 $options(-arg1)]
    ...
    # $a now has a useful value...
}