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,并执行对应代码。

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