Networking GNS3中的tcl脚本。。。。错误的“args:应该是”;foreach变量列表?变量列表。。。?“命令”;

Networking GNS3中的tcl脚本。。。。错误的“args:应该是”;foreach变量列表?变量列表。。。?“命令”;,networking,tcl,cisco,cisco-ios,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 } 当我这样做时,没有任何事

我正在尝试在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的问题


谢谢

您在问题中所写的
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嵌入到路由器这样的环境中时,情况很可能发生了相当大的变化。(这并不是说路由器供应商很难做到。)这意味着命令之间肯定会出现令人惊讶的差异,而且你应该检查一下你所拥有的文档,继续思考,而不是盲目地相信我写的东西。

Donal,谢谢!!看起来您是对的,添加“put”命令使ping结果显示出来。我对编码非常陌生(非常陌生),所以我不完全理解为什么,或者你提到的所有事情,但我会尽力去理解。现在,你肯定帮了我学习人际网络。我真的很感激!抢劫