期望脚本在一定时间内等待特定输入

Expect Script to wait for specific input for a certain amount of time

我正在通过 docker 安装 windows 应用程序,这需要一些用户输入,例如数据库设置等。我正在为这些用户输入使用 expect 脚本来自动化我们的安装。

但是在最后一步,我的安装最多需要 15-20 分钟,因为应用程序需要安装数据库架构和其他必需的元素,然后给出最终输入以按 enter 退出安装过程。

我该如何处理它,目前我只是让我的 expect 脚本等待,但是无论如何我都可以处理这个并让 expect 脚本等待那个特定的输入 "string match"?

这是我的期望脚本的样子

    #!/bin/bash

expect -c '
  spawn sh ./setupapp.sh
  expect "PRESS <ENTER> TO CONTINUE:"
  send "\r"
  expect "PRESS <ENTER> TO CONTINUE:"
  send "\r"
  expect "PRESS <ENTER> TO CONTINUE:"
  send "\r"
  expect "PRESS <ENTER> TO CONTINUE:"
  send "\r"
  expect "PRESS <ENTER> TO CONTINUE:"
  send "\r"
expect "PRESS <ENTER> TO CONTINUE:"
  send "\r"
  expect "Waiting here:"
  send "\r"
  expect "Waiting here:"
  send "\r"
  expect "Waiting here:"
  send "\r"
  expect "Waiting here:"
  send "\r"
  expect "Waiting here:"
  send "\r"
  expect "Waiting here:"
  send "\r"
 expect "PRESS <ENTER> TO Exit Installation:"
 send "\r"
  expect eof
'

我在这里使用 Waiting 等待 10 秒,有什么方法可以让我自动等待最后一个字符串按 Enter 退出安装。

谢谢!

看起来你想要这样的东西:这是期望某事多次发生的最灵活的方式,我们不必关心究竟多少次它发生了。

expect -c '
  set timeout 1200   ;# 20 minutes
  spawn sh ./setupapp.sh
  expect {
    "PRESS <ENTER> TO CONTINUE:" {
      send "\r"
      exp_continue
    }
    "Waiting here:" {
      send "\r"
      exp_continue
    }
    timeout {
      error "nothing happened after $timeout seconds" 
    }
    "PRESS <ENTER> TO Exit Installation:" {
      send "\r"
    }
  }
  expect eof
'

expect 命令等待四件事之一发生。对于前 2 个,按回车键然后继续等待另一个事件。我添加了 "timeout" 事件,以防您想在那里做一些特别的事情。

"press enter to exit" 块 调用"exp_continue"。在它发送回车符 return 之后,封闭的 expect 命令结束,然后我们等待 eof.