나는 다음과 같은 결과를 얻었습니다.
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<"
}
}