Сопоставьте строку с подстрокой в ​​сценарии Expect

У меня есть такой вывод:

Node Name                     Status        IP Address
======================================================
bw2acn0                      ENABLED      x.x.x.x
bw2acn1                      ENABLED     x.x.x.x
bw2dvn0                      ENABLED     x.x.x.x
bw2dvn1                      ENABLED     x.x.x.x
bw2vm0                       ENABLED      x.x.x.x
bw2vm1                       ENABLED      x.x.x.x

, и я хочу создать цикл, чтобы увидеть, содержит ли этот вывод какое-либо имя приложений.

#!/opt/tools/unsupported/expect-5.39/bin/expect

set HOST [ lindex $argv 0 ]
set USER [ lindex $argv 1 ]
set PASSWORD [ lindex $argv 2 ]
set APP1 [ lindex $argv 3 ]
set APP2 [ lindex $argv 4 ]
set APP3 [ lindex $argv 5 ]
set APP4 [ lindex $argv 6 ]

spawn ssh -l $USER $HOST
expect_after eof {exit 0}
set timeout 120

expect "password:" { send "$PASSWORD\r" }

expect "~]#" { set buff $expect_out(buffer)
foreach i $APPS {
     if {[regexp {"${i}"} $buff]} {
    log_file ../report.txti
            send_log "Commit nodes on $i ------------------------------- Passed\n\n"
            puts "*********************paased"
    } else {
    log_file ../report.txt
            send_log "Commit nodes on $i ------------------------------ Failed\n\n"
            puts "******************failed"
        }

}
}
log_file
send "\r"

expect "~]#" { send "date\r" }
expect "~]#" { send "exit\r" }

но все, что я получаю, это то, что он не прошел, хотя должен пройти.

0
03.04.2017, 20:10
1 ответ
if { $buff match {*$APP$i*} } {

Что такое соответствует ? Нет ничего в документации expr , где используется этот термин. Также откуда берется переменная APP ? У вас есть APP1 и т. Д., Но нет APP .

строка группа команд может соответствовать строке с совпадением строк и массивом (что в других языках называется хеш-кодом или ассоциативным массивом) вероятно, лучше сгруппировать имена приложений (узлов?), чем пытаться использовать переменную в качестве имени переменной:

set theapps(app1) foo
set theapps(app2) bar
set theapps(app3) zot

set buff "blah bar blah"

foreach {name value} [array get theapps] {
    if {[string match "*$value*" $buff]} {
        puts "ok - $name $value"
    } else {
        puts "not ok - $name $value"
    }
}

При запуске это соответствует bar для app2 :

$ tclsh choices
not ok - app3 zot
not ok - app1 foo
ok - app2 bar
$ 

A Второй вариант - использовать список элементов для поиска. Это можно сделать, убрав в аргументах имена, не относящиеся к приложениям, а затем перебрав в цикле оставшиеся элементы:

proc shift {list} {
    set result ""
    upvar 1 $list ll
    set ll [lassign $ll result]
    return $result
}

set HOST [shift argv]
set USER [shift argv]
set PASSWORD [shift argv]

puts "leading args: >$HOST< >$USER< >$PASSWORD<"

set buff "blah bar blah"

foreach substr $argv {
    if {[string match "*$substr*" $buff]} {
        puts "match >$buff< on >$substr<"
    }
}
1
28.01.2020, 02:46

Теги

Похожие вопросы