[英]tcl script not running properly
我正在使用tcl脚本打开与Linux机器的ssh连接并打开虚拟交换机应用程序。 在交换机CLI内,我添加了> 1000条IP路由。
我以= ./script_name.tcl
而不是tclsh
身份运行脚本,因为这会给我一些错误。
问题出在tcl如何解释tcl脚本中的while循环。 我的while循环-
sleep 1
set i 1
while {$i < 3 } {
set j 2
expect "*#"
while {$j < 255} {
send "ip route 2.2.$i.$j 255.255.255.255 4.4.4.1\r"
incr j
}
incr i
}
sleep 1
expect "*#"
set k 1
while {$k < 3 } {
set l 2
expect "*#"
while {$l < 255} {
send "ip route 1.1.$k.$l 255.255.255.255 1.1.1.5\r"
incr l
}
incr k
}
我使用2个while循环分别添加约500条路由,因此总数应超过1000条路由。 问题是只有前500条路由被添加,而下一条while循环不起作用。 下一个while循环显示将在CLI中运行,但实际上未添加路由。
但是,如果我使用1 while循环添加1000条路由。 我将while循环计数器从{$i < 3 }
更改为{$i < 5 }
,它可以正常工作。
不知何故,第二个循环无法正确执行。
使用*#
可能有些棘手,因为它也可能匹配零次出现。 取而代之的是,我们可以为提示定义正则表达式,该正则表达式将匹配到行尾(即,使用$
)
sleep 1
set prompt "#(\\s+)?\$"
set i 1
while {$i < 3 } {
set j 2
while {$j < 255} {
send "ip route 2.2.$i.$j 255.255.255.255 4.4.4.1\r"
expect -re $prompt
incr j
}
incr i
}
sleep 1
set k 1
while {$k < 3 } {
set l 2
while {$l < 255} {
send "ip route 1.1.$k.$l 255.255.255.255 1.1.1.5\r"
expect -re $prompt
incr l
}
incr k
}
这应该工作。 如果不是,请添加exp_internal 1
并检查调试信息。 顺便说一句,不要保留不必要的expect
语句,该语句除了根据timeout
值延迟执行之外什么也不会做。
正则表达式的说明如下,
我将两个循环合并为一个,并在以前的目标IP和网关IP重叠的route命令之一中更改了目标IP- 1.1.$k.$l 255.255.255.255 1.1.1.5
set prompt "#(\\s+)?\$"
set i 1
while {$i < 3 } {
set j 2
while {$j < 255} {
send "ip route 2.2.$i.$j 255.255.255.255 4.4.4.1\r"
send "ip route 3.3.$i.$j 255.255.255.255 1.1.1.5\r"
expect -re $prompt
incr j
}
incr i
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.