期望-如何“发送用户”以获得动态变量

时间:2018-10-25 18:23:31

标签: tcl expect

我正在尝试在Expect中发送动态变量,但是有问题。

以下是路由器的输出:

router# show service id 123 base
sdp 1.1.1.1  Up   Up
sdp 2.2.2.2  Up   Up
...
...
...
sdp 5.5.5.5 Up  Up
...
... 
router#

我想要实现的是

1)逐行提取某些信息,直到完成(x行) 例如,我要提取所有IP地址并将其设置为变量。

sdpip1 = 1.1.1.1

sdpip2 = 1.1.1.2

.......

........

sdpipx = x.x.x.x

            while {$count < 10} {
                set linesplit [split $chksdp \n]
                set sdpline [lindex $linesplit 1]
                set sdpfirst [lindex $sdpline 0]


                if {$sdpfirst != $router} {
                    set chksdpA [lindex $sdpline 0]
                    set errsdpline "sdp"

                    if {$chksdpA != $errsdpline} {
                        set sdpval "N/A\n"
                        break
                    } else {

                        set sdpip [lindex $linesplit $indexsdp]
                        set sdpip [lindex $sdpip 1]

                        foreach i $indexsdp {
                            set sdpip$i "$sdpip"
                        }

                        set indexsdp [expr {$indexsdp + 1}]
                        set indexsdpval [expr {$indexsdpval + 1}]
                        set count [expr {$count + 1}]
                        continue
                    }  
            }

2)在脚本末尾,然后我想将所有IP地址发送给用户。。在这里,我遇到了问题。.

send_user "$sdpip$i\n"

我无法使用之前设置的变量send_user

                 foreach i $indexsdp {
                     set sdpip$i "$sdpip"
                 }   

这是为每个IP地址设置增量变量。

如果我手动分配变量,则可以发送给用户。例如:

send_user "$sdpip1\n"
send_user "$sdpip2\n"
send_user "$sdpip3\n"
send_user "$sdpip4\n"

那么,如何根据第一个提取一定数量的行和IP地址的脚本发送给用户?并仅向用户发送该IP地址总数?

谢谢

1 个答案:

答案 0 :(得分:0)

使用动态变量名称总是比较困难。改用列表:

send "show service id 123 base\r"
expect -re {(.*)# ?$} {
    set re_ip {\d+(?:\.\d+){3}}
    set ip_addresses [regexp -all -inline $re_ip $expect_out(1,string)]
}

您正在使用带有期望值的正则表达式模式,并捕获括号。 # ?$位应与命令完成时显示的提示匹配。命令输出(以及“ show service”命令和提示的第一位)将被捕获并存储在expect_out(1,string)变量中。然后,您只需要在该文本块中找到ip地址即可。

要将其显示给用户时:

foreach addr $ip_addresses {send_user "$addr\n"}