expect-學習文檔

文檔出處: Expect :http://www.tcl.tk/man/expect5.31/expect.1.html

1 語法

語法:expect [ -dDinN ] [ -c cmds ] [ -[f|b] cmdfile ] [ args ]

-d表示打印出執行信息,腳本內部命令的執行過程;
-D開啓調試器
-i表示開啓交互
-n表示
-N表示
-c表示先於腳本要執行的命令
-f表示要執行的腳本名字
-b表示
args表示腳本的參數列表

2 示例

linux系統安裝了expect程序,根據英文文檔,編寫了一個文件test文件,打印文件名及後面三個參數:

send_user “$argv0 [lrange $argv 0 2]\n”

linux上執行命令(#號後內容爲註釋,實際執行中沒有這些信息,行首的$表示系統提示符):

#改變文件執行權限
$chmod 777 test
$ ls -l
total 1
-rwxrwxrwx 1 username username 41 Feb 25 09:59 test

#執行腳本文件test,打印出文件名及參數ni hao
$ expect -f test ni hao
test ni hao

#執行腳本文件test,打印出文件名及參數ni hao helo,第四個參數world未打印
$expect -f test ni hao helo world
test ni hao helo

#expect兼容tcl語句,-c表示先於腳本要執行的一些命令, -c後的命令要用引號括起來,多條命令用分號分割
$expect -c “puts helloworld;puts nihao” test ni hao helo world
helloworld
nihao
test ni hao helo

#指定-d選項,會打印此次執行的內部過程
$expect -c “puts helloworld;puts nihao” -d test ni hao helo world
helloworld
nihao
expect version 5.45
argv[0] = expect argv[1] = -c argv[2] = puts helloworld;puts nihao argv[3] = -d argv[4] = test argv[5] = ni argv[6] = hao argv[7] = helo argv[8] = world
set argc 4
set argv0 “test”
set argv “ni hao helo world”
executing commands from command file test
test ni hao helo

#-D選項開啓debugger,用戶可以進行操作,後面要有一個非零數字;按^C會把控制權交給腳本
$expect -c “puts helloworld;puts nihao” -D 1 test ni hao helo world
helloworld
nihao
2: lrange $argv 0 2
dbg2.0>puts $argv
ni hao helo world
dbg2.1> ^C
1: send_user “\$argv0 [lrange \$argv 0 2] \n”

dbg1.2> ^C
test ni hao helo
1: exit 0
dbg1.3> ^C
2: rename _close.pre_expect close
dbg2.4> ^C
$

#-i會開啓expect 交互界面,用exit可以退出
$expect -c “puts helloworld;puts nihao” -i test ni hao helo world
helloworld
nihao
expect1.1> puts [lindex $argv 0]
test
expect1.2> exit
alan.yu@dev-18:~/automation_bk$

3 常用命令

1 spawn [args] program [args]

新建一個進程,執行命令program [args] ,返回值是進程的UNIX id。其stdin, stdout and stderr 都和Expect連接,所以可以被Expect的其他命令讀寫。用close進行關閉當前進程及其相關文件。
spawn啓動進程時,會產生一個變量spawn_id, 存儲了進程的描述符。

2 send [-flags] string

將字符串string發送給當前進程。比如

send “hello world\r”

表示發送 h e l l o [blank] w o r l d [return]給當前進程。回車符”\r”用於使程序讀取行緩存中的字符串。
-i標誌表示字符串的目的進程的spawn_id。
-null表示發送Null字符,後面可以跟一個整數,表示發送多少個null。
-break
-s
-h表示模擬人輸入字符串的情況,人的輸入會有延時,用變量 “send_human”控制。它有五個參數,前兩個控制平均間隔,單位爲秒,第一個是默認間隔,第二個是詞尾的間隔,第三個表示間隔的可變性,(.1表示變化很大,1表示變化一般,10表示變化很小,範圍從0到infinity),第四和第五個分別表示最小和最大的間隔。比如

set send_human {.1 .3 1 .05 2}
send -h “I’m hungry. Let’s do lunch.”

表示快速的連續輸入。
執行send前一般會執行一個expect, 用於等待進程執行完上一條命令再處理字符串。也可以在send前添加等待時間。

exp_send是send的同義詞,不過send在一些工具中,如ExpectTk,意義有差別! exp_send可兼容環境。

3 expect [[-opts] pat1 body1] … [-opts] patn [bodyn]

用於等待一段時間,直到某個特定的字符(串),或者超時,或者到達文件結尾。
expect_before命令指定的pattern會優先與expect的各pattern進行查找,expect_after命令指定的pattern會在查找完expect的各pattern後再進行查找。
整個expect的參數如果是多行,需要用大括號括起來,這樣就不用每一行末尾都使用反斜線 \ 了。不過tcl中的substitutions會出現在括號中。
pattern是eof,表示在文件結尾會執行對應的代碼;如果是timeout,就表示超時後會執行對應代碼,超時時間默認是10s, 可以通過 “set timeout 30” 修改爲30s, 設置爲-1表示無限等待;如果是default,表示超時或者文件末尾會執行的代碼。出現多個匹配的Pattern時,會選擇第一個匹配的pattern,並執行對應代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章