
このコードがあり、コマンドの出力を読み、最初から特殊文字まで部分文字列で囲み、セクションが空でない場合に渡されるログを送信したいと思います。しかし、どうすればいいのかわかりません。これまで私が得たものは次のとおりです。
#!/opt/tools/unsupported/expect-5.39/bin/expect
spawn ssh -l $USER $VMIP_1
expect_after eof {exit 0}
set timeout 10
match_max 256
expect "(yes/no)?" { send "yes\r" }
expect "password:" { send "$PASSWORD\r" }
expect "~]#" { send "date\r" }
expect "~]#" { send "pidof snmpd\r" }
sleep 5
expect "~]#" {
set buf [split $expect_out(buffer) "[root@"]
if {[lindex $buf 0] !=="" }
{
log_file /home/bebehman/vnf/trunk/report.txt
send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Passed\n"
} else { send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Failed\n"
}
}
答え1
split
思い通りにはならないので参考にしてください。単語に基づいて分割されず、2 番目の文字列に指定された文字に基づいて分割されます。たとえば、シーケンスが含まれていなくても2つの部分split "xax" "abc"
に分けられます。xax
abc
たとえば、特定の部分文字列から文字列を分割する簡単な方法は、コマンドを使用して部分string first
文字列の先頭を見つけ、string range
その点にコピーすることです。
set str $expect_out(buffer)
set v [string range $str 0 [string first "\[root@" $str]-1]
v
その後、空であることをテストできます。
または を実行する代わりにexpect "~]#"
を実行するexpect "\[root@"
と、$expect_out(buffer)
抽出する内容がすでに含まれます。
以前のバージョンのtcl / expectでは、数値 - 数値形式を受け入れるのexpr
ではなく、インデックスから1を引く必要があります。string range
たとえば、次のようにします。
set v [string range $str 0 [expr [string first "\[root@" $str] - 1]]
答え2
if {[lindex $buf 0] !=="" }
{
コンパイルされません。代わりにこれが必要です。
if { [lindex $buf 0] != "" } {