Tcl 预期脚本操作顺序

Tcl 预期脚本操作顺序,tcl,expect,Tcl,Expect,所以首先,我会承认我是一个非常新的期待脚本,我已经玩了大约3天了。我拿起了奥莱利的书,正在努力阅读。然而,我对expect的流程有点困惑,希望得到一些指导 我有下面的代码剪辑。if语句的上半部分工作正常。但是,elseif部分并没有按预期工作。它会执行,只是不正常。它首先处理put行,然后通过send命令向下运行。我想知道它为什么这样做,以及如何使它按顺序执行 我还想做的另一个调整是,当$MD5没有匹配项时,我不想等待超时。所以基本上我希望$MD5或任何不是$MD5的东西,这样我就不必坐在那里等

所以首先,我会承认我是一个非常新的期待脚本,我已经玩了大约3天了。我拿起了奥莱利的书,正在努力阅读。然而,我对expect的流程有点困惑,希望得到一些指导

我有下面的代码剪辑。if语句的上半部分工作正常。但是,elseif部分并没有按预期工作。它会执行,只是不正常。它首先处理put行,然后通过send命令向下运行。我想知道它为什么这样做,以及如何使它按顺序执行

我还想做的另一个调整是,当$MD5没有匹配项时,我不想等待超时。所以基本上我希望$MD5或任何不是$MD5的东西,这样我就不必坐在那里等待默认超时。我意识到我可以期望超时1“$MD5”并缩短窗口,但我想知道是否有更优雅的方法来处理这个问题

先谢谢你

expect "$MD5"
if {$MD5 == $expect_out(0,string)} {
    send "config t\r";
    send "no boot system\r";
    send "boot system flash:$IOS\r";
    send "exit\r";
    send "wr mem\r";
    expect "OK";
    send "exit\r";
    puts -nonewline "\nIOS Upgrade Successful and Bootvar changed.\n"
    exit
} elseif {$MD5 != $expect_out(0,string)} {
    send "delete flash:$IOS\r";
    send "\r";
    send "\r";
    send "exit\r";
    puts -nonewline "\nIOS Upgrade FAILED MD5 Hash did not match!\n";
    expect eof
    exit
}

Expect实际异步处理
发送
,这取决于生成的应用程序实际接受数据的速度(还有一些其他速率限制)。为了让事情等待,您需要使用
expect


解决方法是将
put
放在
expect-eof
之后(或者将
expect
放在其他事情之前,比如在执行
delete flash后得到的提示:…
)。

当你可以同时等待多件事情时(如何操作请参见示例),你不能轻易等待的是“任何意外的事情”因为你太容易得到错误的匹配(例如,来自你想要的前缀)。谢谢你的回复。清理下面的代码:
expect“$MD5”if{$MD5==$expect\u out(0,字符串)}{send“config t\r”send“no boot system\r”send“boot system flash:$IOS\r“send”exit\r“send”wr mem\r“expect”OK“send”exit\r“put-nonewline”\nIOS升级成功,Bootvar已更改。\nexit}else{send“delete/force flash:$IOS\r“send”exit\r“expect eof puts-nonewline”\nIOS升级失败MD5哈希不匹配!\n“exit}