我有这段代码,我希望它读取命令的输出,将其从开头子串到特殊字符,然后如果该部分不为空则发送它传递的日志。但我不知道该怎么做。这是我到目前为止所得到的。
#!/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
并不像您想象的那样工作。它不会根据单词进行拆分,而是根据第二个字符串中给出的任何字符进行拆分。例如,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] != "" } {