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