我正在使用tcl脚本打开与linux机器的ssh连接并打开虚拟交换机应用程序。在交换机CLI内部,我添加了> 1000条IP路由。
我将脚本设为= ./script_name.tcl
而不是tclsh
,因为这会给我一些错误。
问题在于tcl如何解释tcl脚本中的循环。 我的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个路径,因此总数应该为&gt; 1000个路由。问题是只添加了~500个路由,而下一个while循环不起作用。下一个while循环显示在CLI中工作,但实际上没有添加路由。
但是如果我使用1 while循环来添加1000条路线。我将while循环计数器从{$i < 3 }
更改为{$i < 5 }
并且它可以正常工作。
不知何故,第二个循环没有正确执行。
答案 0 :(得分:2)
使用*#
可能有点棘手,因为它也可能匹配零次出现。而不是那样,我们可以为提示定义正则表达式,该正则表达式将匹配行尾(即使用$
)
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
值延迟执行。
正则表达式的解释如下,
答案 1 :(得分:0)
我将两个循环合二为一,并且还改变了其中一个路由命令中的目标IP,其中之前目标和网关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
}