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

How do I prevent substitution before processing in TCL?

我正在这样调用 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.

怎么样

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

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

欢迎引用恐怖故事。

如果你在程序中适当地扩展它,把它当作一个适当的列表来对待:

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

这将完全按照您的预期传递给您的过程:分为四件事:

  • 字符串-arg1
  • list/scriptping - c1 10.1.1.$ip
  • 字符串-arg2
  • 字符串<$b 扩展为>

在你的过程中,你将不得不再次 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...
}