预期-预期比较

时间:2019-03-01 23:19:31

标签: tcl expect

我收到了要捕获的远程设备的输入,并根据它执行一些命令-脚本运行正常!但是有一个问题-期望在每行中循环(使用exp_continue),并且当找到REGEX匹配项时根据匹配项($ expect_out)执行一些命令..效果很好..但是实际上是基于每一行! :((我想以某种方式将$ expect_out(n,string)与其他先前和未来的比赛进行比较,并仅根据唯一的比赛执行一个命令。

也许举个例子更简单:

输入包含:“ 1/1/1”和“ 1/1/2”重复的字符串,但是在不同的行上,我捕获了它们并根据它们执行重复的命令:(

输入:

VL.  Interface
-----------------------
10   vlanIf:1/1/1:10
20   vlanIf:1/1/3:20
30   vlanIf:1/1/2:30
40   vlanIf:1/1/4:40
50   vlanIf:1/1/2:50
60   vlanIf:1/1/1:60
70   vlanIf:1/1/1:70

脚本:

  #!/usr/bin/expect -f
  telnet ...
  ---snipped--
  set prompt "#"

# cmd1
  expect "$prompt" { send "show interface vlan\r" ; set is_ok "cmd1" }
    if { $is_ok != "cmd1" } { send_user "\n## #----- 9 Exit on executing command3\n" ; exit }

# cmd2 ... n
  expect -re "(vlanIf:)(\\d+/\\d+/\\d+):(\\d\{1,4\})" {
    set secondMatch "$expect_out(2,string)" 
    send "show test1 $secondMatch\r"
    send "show test2 $secondMatch\r"
    send "show test3 $secondMatch\r"
    exp_continue
  }

我的尝试结果是:

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

  send "show test1 1/1/3\r"
  send "show test2 1/1/3\r"
  send "show test3 1/1/3\r"

  send "show test1 1/1/2\r"
  send "show test2 1/1/2\r"
  send "show test3 1/1/2\r"

  send "show test1 1/1/4\r"
  send "show test2 1/1/4\r"
  send "show test3 1/1/4\r"

  send "show test1 1/1/2\r"
  send "show test2 1/1/2\r"
  send "show test3 1/1/2\r"

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

结果应为:

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

  send "show test1 1/1/3\r"
  send "show test2 1/1/3\r"
  send "show test3 1/1/3\r"

  send "show test1 1/1/2\r"
  send "show test2 1/1/2\r"
  send "show test3 1/1/2\r"

  send "show test1 1/1/4\r"
  send "show test2 1/1/4\r"
  send "show test3 1/1/4\r"

* 1/1/1 /,1/1 / 3、1 / 1 / 2、1 / 1/4是变量,但在示例中,我将内容放置了:

1 个答案:

答案 0 :(得分:0)

我找到了一个对我有用的答案:)

实际上很简单。

...
if [regexp $secondMatch $secondMatchSTACKED] {
  exp_continue
} else {
...
send "show test1 $secondMatch\r"
send "show test2 $secondMatch\r"
send "show test3 $secondMatch\r"
set secondMatchSTACKED "$secondMatchSTACKED$secondMatch "
exp_continue