tcl脚本无法正常运行

时间:2015-11-17 12:07:41

标签: while-loop tcl

我正在使用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 }并且它可以正常工作。

不知何故,第二个循环没有正确执行。

2 个答案:

答案 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值延迟执行。

正则表达式的解释如下,

enter image description here

答案 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
}