我正在运行带有Cisco OS版本7.0.5(N1)1的Cisco Nexus 5548Up。它带有TCL解释器8.5.7版,我正在以交互方式使用它,但是得到的结果我不了解,也不知道如何纠正。
set VLAN_MATCH_LIST {}
lappend VLAN_MATCH_LIST 102
lappend VLAN_MATCH_LIST 122
lappend VLAN_MATCH_LIST 232
lappend VLAN_MATCH_LIST 242
lappend VLAN_MATCH_LIST 243
lappend VLAN_MATCH_LIST 246
lappend VLAN_MATCH_LIST 259
lappend VLAN_MATCH_LIST 283
lappend VLAN_MATCH_LIST 286
lappend VLAN_MATCH_LIST 288
lappend VLAN_MATCH_LIST 334
lappend VLAN_MATCH_LIST 341
lappend VLAN_MATCH_LIST 346
lappend VLAN_MATCH_LIST 356
lappend VLAN_MATCH_LIST 358
lappend VLAN_MATCH_LIST 373
puts "List: $VLAN_MATCH_LIST"
puts "Found item 122 at index [lsearch VLAN_MATCH_LIST 122]"
不幸的是,我期望在索引1处找到“ 122”,但我一直得到此输出(仅最后两行):
List: 102 122 232 242 243 246 259 283 286 288 334 341 346 356 358 373
Found item 122 at index -1
如果您想知道,我会做所有lappend的事情,而不是使用set
命令,原因是希望确保该问题与我的变量初始化语法无关,而是更实质性的事情。
答案 0 :(得分:1)
对列表变量的引用应带有$
符号。尝试使用[lsearch $VLAN_MATCH_LIST 122]
代替。另外,默认列表匹配规则为-glob
。 Is不会在您的情况下引起错误,但是如果您愿意,最好使用-exact
匹配规则。
答案 1 :(得分:1)
您要将变量的名称赋予lsearch
,而不是该变量中包含的列表值。您需要使用$
作为前缀来取消引用该名称:
puts "Found item 122 at index [lsearch $VLAN_MATCH_LIST 122]"
Tcl非常关心变量名称及其内容之间的区别。一些Tcl命令使用变量名(脚本中的set
和lappend
都是这样);这通常是因为他们正在更新变量。值本身在逻辑上是只读的(实现比这更聪明,但这不是您现在应该考虑的事情。)