我需要使用以下字符串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]
请帮帮我吧?我错过了什么答案 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
命令将安全脚本构建作为其超级超级大国之一。