Bash 脚本 - 根据数组数据自动完成用户输入

Bash 脚本 - 根据数组数据自动完成用户输入

在 bash 脚本中,我正在读取一些用户输入read。现在我想提供通过按键自动完成输入的可能性Tab

简单的示例:假设用户应输入来自有限域的名称。在脚本中,我有一个包含所有有效名称的数组,这些名称应包含在自动完成建议中。

我已经尝试过一些具有可编程完成功能的东西,但我希望脚本是可移植的,即一切都应该是这个脚本。类似的东西是 mysql - 如果你输入SELECT * FROM并点击Tab它会显示数据库中的所有可用表(实际上是所有列)。

应该可以在 Mac OS X 上运行。

答案1

使用回卷,一个 readline 包装器。

man rlwrap

rlwrap 运行指定的命令,拦截用户输入,以提供 readline 的行编辑、持久历史记录和完成功能。

以及 Debianrlwrap软件包描述:

该软件包提供了一个小实用程序,它使用 GNU readline 库来允许编辑任何其他命令的键盘输入。输入历史记录会在调用过程中被记住,对于每个命令都是单独的;历史补全和搜索工作与 bash 中一样,并且可以在命令行上指定补全单词列表。

一个非常简单的示例脚本:

#! /bin/bash

ynm=(Yes No Maybe)

reply=$(rlwrap -S 'Do you want to continue? ' -H ~/.jakob.history
        -e '' -i -f <(echo "${ynm[@]}") -o cat)

echo "reply='$reply'"

这使用 的rlwrap一次性模式来运行cat(以获取标准输入),但仅接受一行输入。 -o catrlwrap的推荐替代品read

命令行历史记录存储在 中~/.jakob.history,完成项存储在 bash 数组中$ynm

rlwrap需要一个文件作为选项的参数-f。幸运的是,我们可以使用进程替换<(echo "${ynm[@]}")来提供数组而不是文件。

-i启用完成时不区分大小写。

成功完成后停止-e ''追加rlwrap空格(以便$reply最终包含,例如,'Maybe'而不是'Maybe '尾随空格)

如果您希望在输入行上预先输入默认值,则可以使用-P--pre-given选项 - 例如添加-P Yesrlwrap上面示例脚本中的命令。用户只需点击Enter接受或退格键或Ctrl-即可删除默认值(这在 emacs 模式下U是正常的)。readline

请参阅man rlwrap了解详细信息和更多选项。例如,您可以使用-c或启用文件名完成--complete-filenames

在下载和编译源代码之前,检查是否rlwrap为您的发行版打包(至少适用于 Debian,可能至少适用于 Ubuntu/Mint/etc)。

相关内容