Ожидайте - Как «send_user» для динамической переменной - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь отправить динамическую переменную в 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) извлекать определенную информацию все построчно до конца (х строк). Например, я хочу извлечь весь IP-адрес и установить переменную.

sdpip1 = 1.1.1.1

sdpip2 = 1.1.1.2

.......

........

sdpipx = xxxx

            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"

Я не могу отправить_пользователя, используя переменную, которую яустановите перед этим

                 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 голосов
/ 25 октября 2018

Работать с динамическими переменными names всегда сложнее.Вместо этого используйте список:

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"}
...