tcl 脚本不 运行 正确
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 - 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
}
我正在使用 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 - 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
}