无效的命令名称“2001:172:16:21 :: 36”

时间:2018-06-12 09:55:56

标签: tcl

我需要使用以下字符串UDP6分配我的最终变量:[2001:172:16:21 :: 36]

  set ipAddr1 "UDP6,2001:172:16:21::36"
  set ipAddrArr [split $ipAddr1 ","]
  set ipAddrArr11 [lindex $ipAddrArr 0]
  set ipAddrArr12 [lindex $ipAddrArr 1]
  set tmp ":\["
  set ipAddr1Part [join "$ipAddrArr11 $ipAddrArr12" $tmp]
  set tmp1 "]"
  set ipAddrFinal [join "$ipAddr1Part$tmp1"]

当我运行tcl脚本时,它会给出无效的命令名称:2001:172:16:21 :: 36。 我打印了ipAddrFinal值,它给出了预期的一个UDP6:[2001:172:16:21 :: 36]

请帮帮我吧?我错过了什么

1 个答案:

答案 0 :(得分:1)

你写的脚本工作正常;它将字符串UDP6:[2001:172:16:21::36]分配给变量ipAddrFinal。但是,由于它在某些上下文中包含的字符是Tcl元字符,我怀疑你是然后以不安全的方式使用字符串,很可能是eval或可能{{1} }或subst。如果你看一下错误的堆栈跟踪(默认情况下在uplevel全局变量中),你应该被告知错误的代码在哪里;它可能会给你需要看的几个地方,但通常不会很难找到问题所在的地方。

如果您的问题来自errorInfo,您可能需要使用uplevel来构建命令; list所有问题的99.99%都是以这种方式处理的。如果您的问题来自uplevel,那么您需要切换到使用扩展语法的机会很大。如果您的问题来自eval或者仍然令人困惑,请与我们联系(使用您的堆栈跟踪,如果您不确定问题的来源)。

subst的修复示例:

变化:

eval

为:

set action "puts \"IP\\ address\\ is\\ $ipAddrFinal\""
eval $action

注意:执行set action [list puts "IP address is $ipAddrFinal"] {*}$action 时的错误也是一个合理的例子:

invalid command name "2001:172:16:21::36"
    while executing
"2001:172:16:21::36"
    ("eval" body line 1)
    invoked from within
"eval $action"

请注意,它表示它位于eval中,并且正好指向不安全的脚本构造。 eval命令将安全脚本构建作为其超级超级大国之一。