expect的規則看似簡單,一旦進入書寫代碼階段,首先碰到的就是匹配問題。深刻理解這個匹配,後續的書寫就會順暢許多。sql
先看一段示例代碼:ui
package require Expect spawn echo "abcdef" expect { a { puts a exp_continue } b { puts b exp_continue } a* { puts a* exp_continue } eof {} timeout {} }
輸出:spa
spawn echo abcdef abcdef a b
expect彷佛會記住最後一個匹配的位置(記做p),每次新的匹配都是從p開始。也能夠描述成expect丟棄已經匹配的文本,保留還沒有匹配的文本再加上接下來的輸出(具體是什麼狀況不重要)。爲何得出這個結論呢?若是不是這樣,上面的示例代碼就會進入循環。a 和 a*。code
若是是a這樣的模式,你沒法肯定a到底匹配多少,只有在尾部特徵的匹配纔是可控的。若是是*f,那麼必須等到f出現纔會匹配,或者timeout 或者eof對象
只有在匹配以後,該值纔會最新的內容。同時也能夠肯定,匹配對象不是$expect_out(buffer).class
你不能在一個匹配中連續send數據,必須是一問一答的方式。以sql輸入爲例,必須在上一個sql結束後再次輸入。require