我正在尝试在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地址总数?
谢谢
答案 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"}