让 bash 脚本回答交互式提示

有没有可能让 bash 脚本自动处理通常会以默认操作呈现给用户的提示?目前我使用一个 bash 脚本来调用一个内部工具,这个工具会向用户显示完成操作的提示(提示 Y/N) ,但是我正在编写的脚本需要完全“放手”,所以我需要一种方法来发送 Y|N到提示符,以允许程序继续执行。这可能吗?

211771 次浏览

这不是“自动完成”,这是自动化。

您也可以只使用来自 yes的管道输入。

很简单

echo "Y Y N N Y N Y Y N" | ./your_script

这允许您将任何“ Y”或“ N”序列传递给脚本。

我发现发送输入的最佳方式是使用 cat 和一个文本文件来传递您需要的任何输入。

cat "input.txt" | ./Script.sh

如果你只需要发送 Y:

$> yes Y |./your_script

如果您只需要发送 N:

$> yes N |./your_script

在我的情况下,我需要回答一些问题没有 Y 或 N,但与文本或空白。在我的情况下,我发现最好的方法是创建一个 shell 脚本文件。在我的例子中,我称它为 autocomplete. sh

我需要为一个原则模式导出程序回答一些问题,所以我的文件看起来像这样。

—— 这只是一个例子——

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

我喜欢这个策略的地方在于你可以注释你的答案是什么,并且使用一个空行 EOF 就是那个(默认的答案)。事实证明,这个导出程序工具有自己的 JSON 对应物来回答这些问题,但是我在这样做之后才发现这一点 =)。

要运行脚本,只需在您想要的目录中,并在终端中运行 'sh autocomplete.sh'

简而言之,通过使用 < EOL & EOF 与回程线相结合,您可以根据需要回答提示的每个问题

我的例子只是展示了如何使用注释,也使用’字符,以便您记住每一步是什么。

注意这个方法的另一个优点是你可以用更多的 Y 或 N 来回答... 事实上你可以用空格回答!

希望这能帮到别人。

有一个特殊的内置直到这一点-’是的’。

若要用相同的答案回答所有问题,可以运行

yes [answer] |./your_script

或者你可以把它放在你的脚本有具体的答案,每个问题