Bash Shell创建简单的菜单

Bash Shell创建简单的菜单,你有一个简单的 SQL 脚本,希望能够针对不同的数据库运行,以便将其重置用于各种测试。可以直接在命令行上提供数据库名,但你想要拥有更多的交互性。如何编写一个可以从数据库名称列表中进行选择的 shell 脚本呢?

解决方案

用 select 语句创建简单的字符型屏幕菜单,如例所示。

#!/usr/bin/env bash
# 实例文件:dbinit.1
#
DBLIST=$(sh ./listdb | tail -n +2)
select DB in $DBLIST
do
    echo Initializing database: $DB
    mysql -u user -p $DB <myinit.sql
done

暂时先忽略 $DBLIST 是如何得到值的,知道该值是一个单词列表即可(就像 ls 命令的输出)。select 语句会显示出这些单词,每个单词前都有一个数字,然后由用户做出选择。用户只需要输入菜单项数字,对应的单词就会保存在 select 之后指定的变量(本例中是变量 DB)中。

以下是运行该脚本时的输出。

$ ./dbinit
1) testDB
2) simpleInventory
3) masterInventory
4) otherDB
#? 2
Initializing database: simpleInventory
#?
$

讨论

如果用户输入“2”,则单词 simpleInventory 会保存在变量 DB 中。如果着实需要用户所选的菜单项编号,你可以在变量 $REPLY 中找到。本例中的这个值是 2。
select 语句其实就是一个循环。当用户输入选择时,执行循环体(位于 do 和 done 之间),然后再次提示用户输入下一次选择。

菜单不会每次都重新显示,除非用户什么都不选,直接按下回车键。因此,要想再看菜单,按回车键就行了。

此外,菜单也不会对 in 之后的变量重新求值,也就是说,一旦 select 语句运行,就无法改动菜单了。就算你在循环内修改了 $DBLIST,菜单也不会出现变化。
如果碰到文件结束符,则停止循环,在交互式用法中,这意味着用户按下了 Ctrl-D。(如果通过管道将一系列选择传给 select,那么输入结束时,循环也会随之结束)。

尽管 select 确实会考虑 $COLUMNS 的值,但并没有什么办法能控制菜单的格式。要是你打算使用 select,那也只能坦然接受了。不过,你可以用变量 $PS3 来修改 select 的提示符。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!