2.7 迈向图形化:dialog工具
在结束讨论shell脚本程序之前,我们还将介绍一个特性,尽管严格来说它并不是shell的一部分,但是通常情况下它仅仅在shell程序设计中有用,所以我们将在这里讨论它。
如果你知道你的脚本程序只需要运行在Linux控制台下,则可以使用dialog工具命令,它以一种非常简洁的方式润色你的脚本程序。这个命令使用基于文本的图形和色彩,但它的确提供了友好的面向图形的解决方案。
dialog工具的整体思想非常简单:一个带有各种各样参数和选项的单个程序,它允许你显示不同类型的图形框,范围涵盖从最简单的Yes/No框到输入框,甚至菜单选项。当用户执行某种类型的输入后,这个工具一般就会返回,返回结果可以通过退出状态或通过标准错误流来获取用户输入的方式来获得。
在详细介绍它之前,先来看一个非常简单的使用dialog的例子。我们可以在命令行上直接使用dialog,这对于程序的原型设计很有用。现在让我们创建一个简单的消息框来显示传统意义上的第一个程序:
![]()
在屏幕上就会显示一个图形化的消息框,通过OK对话框关闭它(见图2-3)。

图 2-3
现在,我们可以看出dialog的使用非常容易,接下来我们对它的各种可能性进行详细地介绍。
表2-22列出了可以创建的对话框的主要类型。
表 2-22
|
类 型 |
用于创建类型的选项 |
含 义 |
|
复选框 |
--checklist |
允许你显示一个选项列表,每个选项都可以被单独的选择 |
|
信息框 |
--infobox |
在显示消息后,对话框将立刻返回,但并不清除屏幕 |
|
输入框 |
--inputbox |
允许用户输入文本 |
|
菜单框 |
--menu |
允许用户选择列表中的一项 |
|
消息框 |
--msgbox |
向用户显示一条消息,同时显示一个OK按钮,用户可以通过选择该按钮继续操作 |
|
单选框 |
--radiolist |
允许用户选择列表中的一个选项 |
|
文本框 |
--textbox |
允许在带有滚动条的文本框中显示文件的内容 |
|
是/否框 |
--yesno |
允许你提问,用户可以选择yes或no |
还有一些其他的dialog框类型(例如,进度框和密码框)可用。如果想了解更多不常用的dialog类型,你可以像往常一样参考在线使用手册。
如果想获得任何类型的允许文本输入或进行选择的对话框的输出,你必须捕获标准错误流,通常是把它指向某个临时文件以便后续处理。要想获得Yes/No对话框的输出结果,只需查看它的退出码,与所有设计良好的程序一样,返回0表示成功(例如,选择yes选项),1表示失败。
所有的dialog类型都有各种各样的用于控制的额外参数,比如控制显示的对话框的大小和形状。我们首先列出每种类型需要的参数(见表2-23),然后在命令行上演示其中一部分参数的用法,最后,我们编写一个简单的程序来把几种对话框结合起来。
表 2-23
|
对话框类型 |
参 数 |
|
--checklist |
text height width list-height [tag text status]... |
|
--infobox |
text height width |
|
--inputbox |
text height width [initial string] |
|
--menu |
text height width menu-height [tag item]... |
|
--msgbox |
text height width |
|
--radiolist |
text height width list-height [tag text status]... |
|
--textbox |
filename height width |
|
--yesno |
text height width |
除此之外,所有的dialog类型都有几个相同的参数选项。在此我们不一一列出,只介绍两个选项:--title和--clear,前者允许你指定对话框的标题,后者用来完成清屏操作。与以前一样,请查询使用手册来了解完整的选项列表。
实验:使用dialog工具
让我们直接跳到一个很复杂的例子。一旦你理解了这个例子,所有其他的程序就非常简单了!这个例子将创建一个标题为Check me的复选框,它包括一条提示信息Pick Numbers。复选框高15字符,宽25字符,同时每个选项占用3个字符高。最后,我们用默认的开关选择来列出要显示的选项。
![]()
图2-4显示了该命令执行的结果。

图 2-4
实验解析
在本例中,我们用参数--checklist来创建一个复选框。选项--title将标题设置为Check me,下一个参数是提示信息Pick Numbers。
接下来设置对话框的大小。它高15行,宽25个字符,同时有3行被用做菜单。这个大小并不是最合适的,但是你可以从中看到内容的排列方式。
选项的设置看上去需要有一些技巧,但是你必须知道的是每个菜单选项有三个值:
l 编号
l 文本
l 状态
因此第一项的编号是1,显示的文本是“one”并且状态设置为“off”。然后设置下一个菜单项,它的值分别是2、“two”和选中。依次继续直到菜单项设置完毕。
是不是很容易?你可以在命令行上尝试一下,看看它的使用有多么简单。
为了能将这些放在一个程序中,我们需要能够访问用户输入的结果。这一点很容易实现,对于文本输入,我们可以简单地重定向标准错误流,或检查环境变量$?的内容,它实际上就是前一个命令的退出状态。
实验
我们来看一个简单程序的questions,它关注用户的响应:

首先,通过显示一个简单的对话框来告诉用户发生的事情。你不需要获得返回值或获取用户的输入,所以这看起来友好、简单。

现在,用一个简单的yes/no对话框来询问用户是否要继续操作。我们用环境变量$?来检查用户是否选择了yes(返回码是0)。如果用户不想继续操作,就使用一个简单的信息框,它在退出之前不需要用户的输入。
![]()
我们使用一个输入框来询问用户的姓名。重定向标准错误流(2)到临时文件_1.txt中,然后再将它放到变量QNAME中。
![]()
现在显示一个菜单,它包括四个不同的选项。我们再次重定向标准错误流并且把它加载到一个变量中。
![]()
如果用户选择了菜单项1,选择的结果会保存在临时文件_1.txt中,同时这个结果被放入变量Q_MUSIC中以便进行测试。
![]()
最后,清除对话框后退出程序。
图2-5显示了屏幕上的输出信息。

图 2-5
如果你只需要使用Linux控制台,那么现在你已拥有了一种通过shell脚本来编写简单的GUI程序的方法。







