【问题标题】:How to have bash script answer interactive prompts (no y/n only)?如何让 bash 脚本回答交互式提示(仅否 y/n)?
【发布时间】:2017-09-04 21:46:51
【问题描述】:

我正在尝试使用名为 PHPCI 的工具构建 Docker 映像。我几乎可以做所有事情,但是当我需要运行 setup 脚本来创建数据库、设置用户名/密码并为工具本身做某种默认配置时,我的第一个问题就出现了。

脚本应该被称为(see here - 从 Composer 安装):

php ./console phpci:install

它会开始询问一些问题。这是所询问内容的完整示例:

******************
 Welcome to PHPCI
******************

Checking requirements... OK

Please answer the following questions:
-------------------------------------

Please enter your MySQL host [localhost]: 
Please enter your MySQL database name [phpci]:
Please enter your MySQL username [phpci]: 
Please enter your MySQL password:   
Your PHPCI URL ("http://phpci.local" for example): http://phpci.localdomain
Use beanstalkd to manage build queue? <yes|no>
Skipping beanstalkd configuration.
Setting up your database... OK
Admin Email: <email>
Admin Name: <user_name>
Admin Password:
User account created!

我将大部分参数存储在ENV 变量中,以便在容器启动后轻松读取它们。或者更好的是他们可以是ARG。我的问题是如何让安装脚本从ENV 变量中读取值?

我知道那里有很多答案,但其中大多数是针对yes|no 的问题,这似乎很容易,但我找不到任何关于这个问题的有用信息。任何帮助都非常受欢迎。

【问题讨论】:

  • 不是heredoc 或expect?
  • @IgnacioVazquez-Abrams 你在说this??
  • 就是那个。

标签: linux bash shell docker environment-variables


【解决方案1】:

考虑以下两个测试脚本:

tmp()
{
  var=fred
  tmp2 << EOD
$var
EOD
}

tmp2 ()
{
  read var2
  echo $var2
}

如果将它们粘贴到 shell 中,然后运行 ​​tmp,你会得到:

> tmp
fred

“heredoc”语法允许您在程序之后在脚本中包含对提示的响应。所以你想做的是

php ./console phpci:install <<EOD
$HOST
$DATABASE
$USERNAME
$PASSWORD
[ ... etc ... ]
EOD

这应该为你做。请注意,您也可以包含硬编码值(而不是变量)。

如果您愿意,可以阅读有关heredoc at Wikipedia 的更多信息。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2018-04-01
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多