expect基础用法及示例

以下是一个可以使用的脚本 。在这种交互式的应用中,经常需要用到休眠函数,这样可以对输出的界面显示更加友好,而且也可能尽量多的减少 错误的出现

关于转义字符,网上存在一部分,本例中用到来-号需要转义,转义是用两个\来转义。

\ 需转义为 \\\

} 需转义为 \}

[ 需转义为 \[

$ 需转义为 \\\$

` 需转义为 \`

" 需转义为 \\\"


可以用log_user 0或1实现输出屏蔽和显示

log_file test.log   #记录log。追加

expect遵循的是tcl语法。这是一种标准。有时间可以参考学习。

#!/usr/bin/expect -f

set timeout -1#永不超时

set deviceType [lindex $argv 0]

set writesize  [lindex $argv 1]  #设置输入变量

set i 0  #设置变量

log_file test.log   #记录log。

#log_file -noappend rtime_md_test_${stationNum}_[clock format $currenttime -format %m%d%H].log

spawn   /home/redhat/Downloads/Mitsubishi/Latest/Driver/Sample/md_test

expect {

"menu No"     {exp_send "1\r" ;exp_continue}

"ChanelNo"    {exp_send "151\r"}

}

expect {

"mode = "     {exp_send "\\-1\r"}  #这里比较坑爹,害我查了很久很久,最后试出来的

}

while {$i<10} {                 #循环语法使用

#写入数据部分

expect {

"menu No" {exp_send "11\r"}

}

#exec sleep 1

expect {

"StationNo" {exp_send "255\r"}

}

exec sleep 0.01         #休眠时间可以是小数

expect {

"NetworkNo" {exp_send "1\r"}

}

exec sleep 0.01

expect {

"DeviceType" {exp_send "$deviceType\r"}

}

exec sleep 0.01

expect "DeviceNo.(or ChannelNo.)" {exp_send "0\r"}

exec sleep 0.01

expect "WriteSize"  {exp_send "$writesize\r"}

exec sleep 0.01

expect "WriteDataType" {exp_send "2\r"}

#读取数据部分

exec sleep 0.1

expect "menu No."  {exp_send "12\r"}

exec sleep 0.01

expect {

"StationNo" {exp_send "255\r"}

}

exec sleep 0.01

expect {

"NetworkNo" {exp_send "1\r"}

}

exec sleep 0.01

expect {

"DeviceType" {exp_send "$deviceType\r"}

}

exec sleep 0.01

expect "DeviceNo.(or ChannelNo.)" {exp_send "0\r"}

exec sleep 0.01

expect "ReadSize"  {exp_send "$writesize\r"}

incr i

}

expect "menu No" {exp_send "0\r"}

expect eof

expect语法基础: while、for 循环、if 语句的用法示例

==两种for循环的写法
for {set i 0} {$i<=10} {incr i} {#i默认增量是1,即等价incr i 1。注意这个反括号一定要写在这行行末:args: should be "for start test next command"
............
.............}

Q:能不能改为i为我指定的几个数就好。比如我指定i为 3 5 6 7 9这几个数? 谢谢。
foreach  i { 1 3 5 7 9 } {
    puts "$i"
}

注:expect 用的是tcl语法,不是shell语法,或者用switch
==for/while循环写法
    [15:33:[email protected]:~/test/tcl]-(1109)No.108->$ cat tclfor.test
    #!/usr/bin/expect --
    #                  http://bbs.chinaunix.net/thread-2301733-1-1.html
    # for Bob testing
    #
    puts "---1---"
    for {set i 0} {$i < 10} {incr i} {
        puts "I inside first loop: $i"
    }

puts "---2---"
    for {set i 3} {$i < 2} {incr i} {
        puts "I inside second loop: $i"
    }

puts "---3---"
    puts "Start"
    set i 0
    while {$i < 10} {
        puts "I inside third loop: $i"
        incr i
        puts "I after incr: $i"
    }

set i 0
    incr i
    puts "---4---"
    puts "$i"
    # This is equivalent to:
    set i [expr {$i + 1}]    #expect里的加减法
    puts "---5---"
    puts "$i"

运行:

[15:33:[email protected]:~/test/tcl]-(1110)No.109->$ ./tclfor.test

===if的写法

if { $sync_flag == "true" } {

puts "Sync start at [clock format [clock seconds]]"

catch {eval exec ${TOOL_HOME}/bin/${sync_cmd} ${sync_parm} } output
            puts $output
            if { $output eq "SYNC complete!" } {
                    puts "SYNC complete!"
            } else {
                    puts "SYNC error!"
                    exit 1
            }

puts "Sync end at [clock format [clock seconds]]"
    }
===ping的例子
set p_loop 5
while { $p_loop } {
    send_user "\nStpe 1 Ping to server..."
    set timeout 60
    send "ping 10.1.1.1 -c5\r"

expect {

"64 bytes" {
            send_user "ok"
            set p_loop 0
        }
     
        timeout {
            set p_loop [expr $p_loop-1]  #expect里的加减法
            send_user "failed.\n"
        }
        eof {
            send_user "ping 10.1.1.1 -c5 FAIL\n"
            exit 1
        }
}
===expect读取文件的例子
#!/usr/bin/expect --

#            http://scmbob.org/counting_file_lines.html

#open a file
set fd [open "/home/xiabao/myfile.txt" r]
set number 0

# read each line
while { [gets $fd line] >= 0 } { incr number }
puts "Number of lines: $number"

close $fd

时间: 2024-11-07 19:26:31

expect基础用法及示例的相关文章

Vue组件基础用法

前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需,使用不同的组件来拼接页面.这种开发模式使前端页面易于扩展,且灵活性高,而且组件之间也实现了解耦.本文将详细介绍Vue组件基础用法 概述 组件是一个自定义元素或称为一个模块,包括所需的模板.逻辑和样式.在HTML模板中,组件以一个自定义标签的形式存在,起到占位符的功能.通过Vue.js的声明式渲染后,

sed基础用法

在linux系统中,sed的文本处理无疑是一个非常强大的工具,用好sed可以使我们工作效率成倍提升,下面就小结一下sed的常用命令参数,只需关注常用的即可. 选项参数 首先来一发sed --help了解一下常用的参数 # sed --help Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]... -n  忽略打印输出,一般是避免默认输出,只有我们处理的那一行文本会显示在屏幕上 -e  在命令行进行文本的处理

SerialPort类的用法与示例

转:https://www.cnblogs.com/hwBeta/p/6926363.html Microsoft .Net框架SerialPort类的用法与示例 从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,用户可以非常简单地编写少量代码就完成串口的信息收发程序.本文将介绍如何在PC端用C# .Net 来开发串口应用程序. 1. 串口硬件信号定义 DB9 Connector 信号定义 针脚 信号 定义 作用 1 DCD 载波

易优CMS:channel的基础用法

[基础用法] 名称:channel 功能:易优常用标记,可以循环嵌套标签.通常用于网站导航以获取站点栏目信息,方便网站会员分类浏览整站信息 语法: {eyou:channel type='top' row='8' currentstyle='active'} <li class="{$field.currentstyle}"><a href='{$field.typeurl}'>{$field.typename}</a> </li> {/

易优CMS:foreach的基础用法

[基础用法] 名称:foreach 功能:数据/记录循环输出标签(注:类似与volist标签,只是更加简单,没有太多额外的属性.) 语法: {eyou:channel type='top'} {eyou:foreach name='$field.children' item='field1'} <a href='{$field1.typeurl}'>{$field1.typename}</a> {/eyou:foreach} {/eyou:channel} 文件: 无 参数: na

sass基础用法

sass基础用法 SASS是什么 传统的CSS是一种单纯的描述性样式文件,然而SASS可以对CSS进行预编译处理. 在SASS源码中可以使用变量.函数.继承等动态语言的特性,并且可以编译成CSS文件. 安装与使用 安装 由于sass是ruby写的,所以想要使用sass就需要安装ruby环境.然后再使用gem安装sass. 输入下面的命令进行安装sass: gem install sass 可以使用sass -v命令查看sass的版本. 使用 新建一个后缀名为.scss源码文件,就可以编辑sass

游标基础用法

Create PROCEDURE P_InsertSubject@SubjectId intASDECLARE rs CURSOR LOCAL SCROLL FORselect studentid from student where StudentGradu = 1OPEN rsFETCH NEXT FROM rs INTO @tempStudentIDWHILE @@FETCH_STATUS = 0BEGINInsert SelSubject values (@SubjectId,@temp

expect简单用法

1 #!/usr/expect/bin/expect -f 2 3 4 set loginuser [lrange $argv 0 0] 5 set loginpass [lrange $argv 1 1] 6 set ipaddr [lrange $argv 2 2] 7 set port [lrange $argv 3 3] 8 set timeout [lrange $argv 4 4] 9 set from [lrange $argv 5 5] 10 set to [lrange $ar

Cocos数据篇[3.4](6) ——SQLite3数据库基础用法

[唠叨] 在Cocos2d-x中,简单数据存储,可以使用UserDefault.那么如何存储大量,不规则的数据?我们可以使用 SQLite数据库 存储数据.SQLite 是使用非常广泛的 嵌入式数据库 ,它有小巧 .高效.跨平台.开源免费和易操作的特点.所以大量的被用于手机.PDA.MP3播放器.以及机顶盒设备. SQLite数据库是使用C语言来编写的,因此在Cocos2d-x使用SQLite也是得心应手. 本文介绍一下SQLite3数据库的基础用法:增删改查. PS:另外对于SQLite的可视