Expect 스크립트에서 문자열을 하위 문자열과 일치시킵니다.

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

하지만 내가 얻는 것은 통과해야 함에도 불구하고 실패한다는 것입니다.

답변1

if { $buff match {*$APP$i*} } {

무엇인가요 match? 가지다expr문서에는 아무것도 없습니다이 용어를 사용합니다. 그리고 APP변수는 어디에서 오는가? 기다리 세요 APP1. 하지만 아닙니다 APP.

이것string명령 그룹문자열을 string match, 및array(해시 또는 연관 배열이라고 부르는 다른 언어는 무엇입니까?) 변수를 변수 이름으로 사용하는 대신 응용 프로그램(노드?) 이름을 그룹화하는 것이 더 나을 수 있습니다.

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
$ 

두 번째 옵션은 프로젝트 목록을 사용하여 검색하는 것입니다. 이는 비애플리케이션 이름을 매개변수 밖으로 이동한 다음 나머지 항목을 반복하여 수행할 수 있습니다.

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

관련 정보