您的位置:首页 > 其它

expect-学习文档

2016-02-25 10:45 246 查看
文档出处: 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,并执行对应代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: