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
}