tcl expect 究竟是如何匹配輸出的?

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)

只有在匹配以後,該值纔會最新的內容。同時也能夠肯定,匹配對象不是$expect_out(buffer).class

必須是一問一答的模式

你不能在一個匹配中連續send數據,必須是一問一答的方式。以sql輸入爲例,必須在上一個sql結束後再次輸入。require

相關文章
相關標籤/搜索