expect详解

Expect脚本详解
部署运行你感兴趣的模型镜像
1. expect是 基于tcl 演变而来的,所以很多语法和tcl类似,基本的语法如下所示:
1.1 首行加上/usr/bin/expect
1.2  spawn: 后面加上需要执行的shell命令 ,比如说spawn sudo touch testfile
1.3 expect:  只有spawn执行的命令结果才会被expect捕捉到 ,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括: 标准输入的提示信息 eof和timeout

1.4 send和send_user:send会将expect脚本中需要的信息发送给spawn启动的那个进程,而send_user只是回显用户发出的信息,类似于shell中的echo而已。

1.5 puts同send_user 都是打印信息

1.6 expect中的算数运算 set i [expr {i+1}]  //等价于递增运算符 incr i

1.7 if 语法:

注意if while for 等语句中第一行必须为 if空格{}空格{ //{必须出现在该行

===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]]"
    }

1.8 for/while语法:

==for/while循环写法


    #!/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:09-Bob@hzling08:~/test/tcl]-(1110)No.109->$ ./tclfor.test
    ---1---
    I inside first loop: 0
    I inside first loop: 1
    I inside first loop: 2
    I inside first loop: 3
    I inside first loop: 4
    I inside first loop: 5
    I inside first loop: 6
    I inside first loop: 7
    I inside first loop: 8
    I inside first loop: 9
    ---2---
    ---3---
    Start
    I inside third loop: 0
    I after incr: 1
    I inside third loop: 1
    I after incr: 2
    I inside third loop: 2
    I after incr: 3
    I inside third loop: 3
    I after incr: 4
    I inside third loop: 4
    I after incr: 5
    I inside third loop: 5
    I after incr: 6
    I inside third loop: 6
    I after incr: 7
    I inside third loop: 7
    I after incr: 8
    I inside third loop: 8
    I after incr: 9
    I inside third loop: 9
    I after incr: 10
    ---4---
    1
    ---5---
    2
1.9 匹配正则 expect -re "\\\[(.*)]" //其中[在expect shell 正则中都有特殊意义,因此要\三次

     其中()中间的内容为匹配的内容,取出方法为:$expect_out(1,string)

在一个正则表达时中,可以在()中包含若干个部分并通过expect_out数组访问它们。各个部分在表达式中从左到右进行编码,从1开始(0包含有整个匹配输出)。()可能会出现嵌套情况,这这种情况下编码从最内层到最外层来进行的

1.10 取出脚本参数方法  

set file [lindex $argv 0] //获取第一个参数

set num $argc //获取参数个数、

1.11 send 发送完命令之后都需要跟上一个回车"\n"

1.12 若要expect脚本执行完后保留在登陆机器则最后加一句 interact

2. expect 使用方法

2.1 使用“-c”选项,从命令行执行expect脚本

expect可以让你使用“-c”选项,直接在命令行中执行它,如下所示:

$ expect -c 'expect "\n" {send "pressed enter\n"}

pressed enter
$
	如果你执行了上面的脚本,它会等待输入换行符(\n)。按“enter”键以后,它会打印出“pressed enter”这个消息,然后退出。
2.2 使用“-i”选项交互地执行expect脚本
	使用“-i”选项,可以通过来自于标准输入的读命令来交互地执行expect脚本。如下所示:
$ expect -i arg1 arg2 arg3
expect1.1>set argv
arg1 arg2 arg3
expect1.2>
	正常情况下,当你执行上面的expect命令的时候(没有“-i”选项),它会把arg1当成脚本的文件名,所以“-i”选项可以让脚本把多个参数当成一个连续的列表。
	当你执行带有“-c”选项的expect脚本的时候,这个选项是十分有用的。因为默认情况下,expect是交互地执行的。
2.3 当执行expect脚本的时候,输出调试信息
	当你用“-d”选项执行代码的时候,你可以输出诊断的信息。如下所示:
$ cat sample.exp
# !/usr/bin/expect -f
expect "\n";
send "pressed enter";


$ expect -d sample.exp
expect version 5.43.0
argv[0] = expect  argv[1] = -d  argv[2] = sample.exp
set argc 0
set argv0 "sample.exp"
set argv ""
executing commands from command file sample.exp expect: does "" (spawn_id exp0) match glob pattern "\n"? no expect: does "\n" (spawn_id exp0) match glob pattern "\n"? yes expect: set expect_out(0,string) "\n" expect: set expect_out(spawn_id) "exp0" expect: set expect_out(buffer) "\n" send: sending "pressed enter" to { exp0 pressed enter}
2.4 使用“-D”选项启动expect调试器
	“-D”选项用于启动调试器,它只接受一个布尔值的参数。这个参数表示提示器必须马上启动,还是只是初始化调试器,以后再使用它。
$ expect -D 1 script
	“-D”选项左边的选项会在调试器启动以前被处理。然后,在调试器启动以后,剩下的命令才会被执行。
$ expect -c 'set timeout 10' -D 1 -c 'set a 1'
1: set a 1
dbg1.0>
2.5 逐行地执行expect脚本
	通常,expect会在执行脚本之前,把整个脚本都读入到内存中。“-b”选项可以让expect一次只读取脚本中的一行。当你没有写完整个脚本的时候,这是十分有用的,expect可以开始执行这个不完整的脚本,并且,它可以避免把脚本写入到临时文件中。
$ expect -b
2.6 让expect不解释命令行参数
	你可以使用标识符让expect不解释命令行参数。
	你可以像下面这样的读入命令行参数:
$ cat  print_cmdline_args.exp
#!/usr/bin/expect
puts 'argv0 : [lindex $argv 0]';
puts 'argv1 : [lindex $argv 1]';

当执行上面的脚本的时候,会跳过命令行选项,它们会被当成参数(而不是expect选项),如下所示:

$ expect print_cmdline_args.exp -d -c
argv0 : -d
argv1 : -c
3. #!/usr/bin/expect 和 #!/usr/bin/expect -f 区别:

前者会忽略掉 -c 选项 比如脚本文件k.exp:

#!/usr/bin/expect 
puts "aaa"
在命令行执行 ./k.exp -c "bbb" 

后者会输出:

bbb

aaa

您可能感兴趣的与本文相关的镜像

Dify

Dify

AI应用
Agent编排

Dify 是一款开源的大语言模型(LLM)应用开发平台,它结合了 后端即服务(Backend as a Service) 和LLMOps 的理念,让开发者能快速、高效地构建和部署生产级的生成式AI应用。 它提供了包含模型兼容支持、Prompt 编排界面、RAG 引擎、Agent 框架、工作流编排等核心技术栈,并且提供了易用的界面和API,让技术和非技术人员都能参与到AI应用的开发过程中

xpect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。 :)   Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。   Expect工作原理 :   从最简单的层次来说,Expect的工作方式象一个通用化的Chat脚本工具。Chat脚本最早用于UUCP网络内,以用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。   Chat脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。例如下面的Chat脚本实现等待标准输出出现Login:字符串,然后发送somebody作为用户名;然后等待Password:提示符,并发出响应sillyme。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值