GNS3中的tcl脚本....错误#args:应该是“foreach varList list?varList list ...?command”

时间:2014-01-29 23:02:53

标签: networking tcl cisco cisco-ios

我正在尝试在GNS3中的Cisco路由器上运行tcl脚本;

SanJose1(tcl)#foreach address {
+>192.168.1.1
+>192.168.1.2
+>172.16.224.5
+>172.16.224.6
+>192.168.72.1
+>172.16.224.2
+>172.16.224.1
+>10.2.1.1
+>10.2.2.1
+>} { ping $address }

当我这样做时,没有任何反应,没有ping,没有错误,它只是返回到路由器提示符。 我是否错误地运行了代码?如果它是正确的,那么我可以研究GNS3的问题

谢谢!

1 个答案:

答案 0 :(得分:0)

正如您在问题中所写的那样,foreach显示正确无误。 (如果还有一个参数,你会从问题标题中得到消息,但你的代码示例不应该生成它。)你调用的ping更可能没有写任何可见的东西,而只是将结果生成为字符串。这在Tcl代码中很常见。假设我的诊断是正确的,我希望这样的事情能够发挥作用:

foreach address {
    192.168.1.1
    192.168.1.2
    172.16.224.5
    172.16.224.6
    192.168.72.1
    172.16.224.2
    172.16.224.1
    10.2.1.1
    10.2.2.1
} {
    puts [ping $address]
}

为了清楚起见,我省略了提示并添加了缩进和一些换行符。如果ping实际上是一个外部命令,请改用exec ping $address(依赖于未知命令处理将外部命令引入代码,这被认为是错误的形式,尤其是在脚本模式下禁用它时。)在外部命令中,您可能还希望使用数字传递-c选项,以便将使用的请求数限制为相当小的数量,可能:

puts [exec ping -c 5 $address]

请注意,Tcl解释器支持的命令集可以完全(按设计)更改,并且文档中列出的命令实际上只是一个预先提供的标准库。当Tcl嵌入在像路由器这样的环境中时,事情很可能已经被改变了很多。 (这并不是说路由器厂商很难做到这一点。)这意味着命令中令人惊讶的差异肯定会发生,并且你应该检查你已经获得的文档并继续进行一些思考,而不是盲目地相信什么我写道。