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

时间:2018-06-22 15:57:21

标签: linux sh expect

我正在通过docker安装Windows应用程序,这需要一些用户输入(例如DB设置等)。我正在为这些用户输入使用Expect脚本来使我们的安装自动化。

但是在最后一步中,由于应用程序需要安装数据库架构和其他必需的元素,然后我提供的最终安装信息最多需要15-20分钟,然后提供最终输入以按Enter退出安装过程。

我该如何处理它,目前我只是在等待我的期望脚本,但是无论如何我还是要处理这个并使我的期望脚本等待特定的输入“字符串匹配”?

这是我的期望脚本的外观

    #!/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退出安装。

谢谢!

1 个答案:

答案 0 :(得分:1)

看起来您想要这样的东西:这是期望某件事发生多次的最灵活的方式,我们不必在意确切发生多少次。

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
'

期望命令等待四件事之一发生。对于第一个2,请按Enter键,然后继续等待其他事件。我添加了“超时”事件,以防您想在那里做一些特别的事情。

“按Enter退出”框调用“ exp_continue”。发送回车符后,封闭的Expect命令结束,然后我们等待eof。