【问题标题】:How to make expect command in expect program script to wait for exact string matching如何在期望程序脚本中使期望命令等待精确的字符串匹配
【发布时间】:2012-04-21 17:35:51
【问题描述】:

我想知道如何让 expect 脚本中的 expect 命令等待精确的字符串匹配,然后再继续脚本中的下一行。

Bourne shell (sh) 脚本:

#!/bin/sh
#!/usr/bin/expect

spawn ssh -Y localuser@lbblr-tirumala
expect -exact "localuser@lbblr-tirumala's password: "

# replace password with ur own passwd
send "geomax45\r"

# replace the prompt with ur own prompt
expect "localuser@lbblr-tirumala:~$ "

# run application
send "./sample\r"

expect "*Menu*\r
1. print hello world\r
2. print Bye world\r
3. quit\r
enter choice: "
# enter choice 1
send "1\r"
expect "Bye world\r
*Menu*\r
1. print hello world\r
2. print Bye world\r
3. quit\r
enter choice: $"
# enter choice 2
send "2\r"

在上面的代码中输入 1 后代码应该等待“Bye world\r......”字符串出现在屏幕上。但是即使屏幕提示完全不同的字符串,代码正在执行下一行并输入选项 2,根据期望的定义,这不应该发生。它应该等到期望命令中的完整字符串匹配。

我想知道是否有任何更严格的命令可以使用,以便期望等待直到发生精确的字符串匹配。请帮我解决这个问题

【问题讨论】:

  • exp_internal 1 添加到您的脚本中——这将详细显示您现在期望正在尝试匹配,并且您将能够看到匹配成功的原因。

标签: shell unix scripting sh expect


【解决方案1】:

您已经在脚本的前面使用了它:expect -exact。但是长匹配字符串几乎肯定会导致问题。您应该尝试将其缩减为最短的唯一匹配项,如有必要将其分解为多个 expect 命令。

在这种情况下,仅根据您显示的内容,正确的命令可能是expect -exact "choice:"。但本质上,如果没有可能的程序输出的完整细节,就不可能确定这一点。

【讨论】:

  • 我尝试过使用 expect - exact "" 命令,但仍允许在执行下一个命令的情况下执行下一个命令,而不会在之前的步骤中发生精确的字符串匹配。
  • 您还在尝试匹配整个多行字符串吗?正如我所说,这不起作用(参见match_maxexpect 联机帮助页中关于“系统消化不良”的讨论)。您可能还应该检查超时。
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 2017-05-02
  • 2018-02-21
  • 1970-01-01
相关资源
最近更新 更多