expect的规则看似简单,一旦进入书写代码阶段,首先碰到的就是匹配问题。深入理解这个匹配,后续的书写就会顺畅许多。
先看一段示例代码:
package require Expect
spawn echo "abcdef"
expect {
a {
puts a
exp_continue
}
b {
puts b
exp_continue
}
a* {
puts a*
exp_continue
}
eof {}
timeout {}
}
输出:
spawn echo abcdef
abcdef
a
b
匹配对象
expect似乎会记住最后一个匹配的位置(记作p),每次新的匹配都是从p开始。也可以描述成expect丢弃已经匹配的文本,保留尚未匹配的文本再加上接下来的输出(具体是什么情况不重要)。为什么得出这个结论呢?如果不是这样,上面的示例代码就会进入循环。a 和 a*。
匹配多少
如果是a这样的模式,你无法确定a到底匹配多少,只有在尾部特征的匹配才是可控的。如果是*f,那么必须等到f出现才会匹配,或者timeout 或者eof
$expect_out(buffer)
只有在匹配之后,该值才会最新的内容。同时也可以确定,匹配对象不是$expect_out(buffer).
必须是一问一答的模式
你不能在一个匹配中连续send数据,必须是一问一答的方式。以sql输入为例,必须在上一个sql结束后再次输入。