部件 | 描述 |
---|---|
calendar | 提供选择日期的日历 |
checklist | 显示多个选项(其中每个选项都能打开或关闭) |
form | 构建一个带有标签以及文本字段(可以填写内容)的表单 |
fselect | 提供一个文件选择窗口来浏览选择文件 |
gauge | 显示完成的百分比进度条 |
infobox | 显示一条消息,但不用等待回应 |
inputbox | 提供一个输入文本用的文本表单 |
inputmenu | 提供一个可编辑的菜单 |
menu | 显示可选择的一系列选项 |
msgbox | 显示一条消息,并要求用户选择OK按钮 |
pause | 显示一个进度条来显示暂定期间的状态 |
passwordbox | 显示一个文本框,但会隐藏输入的文本 |
passwordform | 显示一个带标签的隐藏文本字段的表单 |
radiolist | 提供一组菜单选项,但只能选择其中一个 |
tailbox | 用tail命令在滚动窗口中显示文件的内容 |
tailboxbg | 跟tailbox一样,但是在后台模式中运行 |
textbox | 在滚动窗口中显示文件的内容 |
timebox | 提供一个选择小时、分钟和秒数的窗口 |
yesno | 提供一条带有Yes和No按钮的简单消息 |
如上表所见,我们可以选择很多不同的部件。只需要多花点功夫就可以让脚本看起来更专业。
要在命令行上指定某个特定的部件,需要使用双破折线格式:
dialog --widget parameters
其中widget是上表中某个特定的部件,parameters定义了部件窗口的大小以及部件需要的文本。
每个dialog部件都提供了两种形式的输出:
可以通过dialog命令的退出状态码来确定用户选择的按钮。如果选择了Yes或OK按钮,命令会返回状态码0。如果选择了Cancer或No按钮,命令会返回状态码1。可用标准的$?变量来确定dialog部件具体选择了哪个按钮。
如果部件返回了数据,dialog命令会将数据发送到STDERR。我们可以用标准的bash shell方法将其重定向到另一个文件或文件描述符中。
dialog --inputbox "Enter your age:" 10 20 2>age.txt
这条命令将文本框输入的文本重定向到age.txt文本中。
msgbox部件
msgbox部件是对话框中最常见的类型。它会在窗口中显示一条简单的信息,直到用户点击OK后消失。
使用格式:
dialog --msgbox text height width
text参数是要在窗口显示的字符串,height与width参数设定自动换行的窗口大小。如果想要在窗口加一个标题,可以使用--title参数,后接作为标题的文本。
例子:
dialog --title Testing --msgbox "This is a test" 10 20
输入命令后,消息框会显示在终端上。如果你的终端仿真器支持鼠标,可以单击OK来关闭对话框,也可以按下回车键。
yesno部件
该部件在窗口底部生成两个按钮:一个是Yes,一个是No。用户可以用鼠标、制表符或者键盘方向键来切换按钮。选择按钮则使用空格或者回车键。
下面是一个例子:
wsx@wsx:~$ dialog --title "Please answer" --yesno "Is this thing on?" 10 20 # 中间终端有输出 wsx@wsx:~$ echo $? 0
dialog命令的退出状态码会根据用户选择的按钮来设置。选择No返回1,选择Yes就是0。
inputbox部件
inputbox部件提供了一个简单的文本框区域来输入文本字符串,dialog会将它传到STDERR,我们需要重定向获得输入。inputbox提供了两个按钮:OK和Cancel。如果选择了OK,命令退出状态码为0,否则为1。
wsx@wsx:~/tmp$ dialog --inputbox "Enter your age:" 10 20 2>age.txt wsx@wsx:~/tmp$ cat age.txt 24
如果你自己运行过的话就会注意到该值后面没有换行符,这让我们能够轻松将文本内容重定向到脚本变量中,以获得用户输入的值。
textbox部件
textbox部件是在窗口中显示大量信息的极佳办法。它会生成一个滚动窗口来显示由参数所指定的文件中的文本。
wsx@wsx:~/tmp$ dialog --textbox /etc/passwd 15 45
/etc/passwd文件内容显示在可滚动的文本窗口中,可以用方向键来左右或上下滚动显示文件的内容。窗口底部的行会显示当前查看文本处于文件中的哪个位置(百分比)。文本框只包含一个用来选择退出部件的Exit按钮。
menu部件
我们可以用这个部件来创建之前(上一篇笔记)中制作的文本菜单的窗口版本。只要为每个选项提供一个选择标号和文本就行。
wsx@wsx:~/tmp$ dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2>test.txt
第一个参数定义了菜单的标题,之后的两个参数定义了菜单窗口的高和宽,而第四个参数则定义了在窗口中一次显示的菜单项总数。如果存在更多选择,则有滚动条。
菜单项必须使用菜单对:第一个元素是用来选择菜单项的标号(必须唯一);第二个元素是菜单中使用的文本。
dialog命令会将选定(鼠标点击或回车键或选择OK)的菜单项文本发送到STDERR。
fselect部件
该部件在处理文件名时非常方便。不用强制用户键入文件名,我们就可以用fselect部件来浏览文件的位置并选择文件。
使用格式:
wsx@wsx:~/tmp$ dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt
第一个参数是窗口使用的其实目录位置。fselect部件窗口由左侧的目录列表、右侧的文件列表和含有当前选定的文件或目录的简单文本框组成。可以手动在文本框键入文件名,或者用目录和文件列表来选定(使用空格键选定)。
dialog选项
除了标准部件,dialog还有大量定制的选项。前面我们使用的title就是一个。
下面显示了命令可用的选项:
选项 | 描述 |
---|---|
–add-widget | 继续下一个对话框直到按下Esc或Cancel选项 |
–aspect ratio | 直到窗口宽度和高度的宽高比 |
–backtitle title | 直到显示在屏幕顶部背景上的图标 |
–begin x y | 指定窗口左上角的起始位置 |
–cancel-label label | 指定Cancel按钮的替代标签 |
–clear | 用默认的对话背景色来清空屏幕内容 |
–colors | 在对话文本中嵌入ANSI色彩编码 |
–cr-wrap | 在对话文本中允许使用换行符并强制换行 |
–create-rc file | 将示例配置文件的内容复制到指定的file文件中 |
–defaultno | 将yes/no对话框的默认答案设为no |
–default-item string | 设定复选列表、表单或菜单对话中的默认项 |
–exit-label label | 指定Exit按钮的替代标签 |
–extra-button | 在OK按钮和Cancel按钮之间显示一个额外按钮 |
–extra-label label | 指定额外按钮的替换标签 |
–help | 显示dialog命令的帮助信息 |
–help-button | 在OK按钮和Cancel按钮后显示一个Help按钮 |
–help-label label | 指定Help按钮的替换标签 |
–help-status | 当选定Help按钮后,在帮助信息后写入多选列表、单选列表或表单信息 |
–ignore | 忽略dialog不能识别的选项 |
–input-fd fd | 指定STDIN之外的另一个文件描述符 |
–insecure | 在passwd部件中键入内容时显示星号 |
–item-help | 为多选列表、单选列表或菜单中的每个标号在屏幕底部添加一个帮助栏 |
–keep-window | 不要清除屏幕上显示过的部件 |
–max-input size | 指定输入的最大字符串长度。默认为2048 |
–nocancel | 隐藏Cancel按钮 |
–no-collapse | 不要将对话文本中的制表符转换为空格 |
–no-kill | 将tailboxbg对话放到后台,并禁止该进程的SIGHUP信号 |
–no-label label | 为No按钮指定替换标签 |
–no-shadow | 不要显示对话窗口的阴影效果 |
–ok-label label | 指定OK按钮的替换标签 |
–output-fd fd | 指定除STDERR之外的另一个输出文件描述符 |
–print-maxsize | 将对话窗口的最大尺寸打印到输出中 |
–print-size | 将每个对话窗口的大小打印到输出中 |
–print-version | 将dialog的版本号打印到输出中 |
–separate-output | 一次一行地输出checklist部件的结果,不使用引号 |
–separator string | 指定用于分隔部件输出的字符串 |
–separate-widget string | 指定用于分隔部件输出的字符串 |
–shadow | 在每个窗口右下角绘制阴影 |
–single-quoted | 需要时对多选列表的输出采用单引号 |
–sleep sec | 在处理完对话窗口后延迟指定的秒数 |
–stderr | 将输出发送到STDERR(默认) |
–stdout | 将输出发送到STDOUT |
–tab-correct | 将制表符转换为空格 |
–tab-len n | 指定一个制表符占用的空格数(默认为8) |
–timeout sec | 指定无用户输入时,sec秒后退出并返回错误代码 |
–title title | 指定对话窗口的标题 |
–trim | 从对话文本中删除前导空格和换行符 |
–visit-tiems | 修改对话窗口制表符的停留位置,使其包括选项列表 |
–yes-label label | 为Yes按钮指定替换标签 |
--backtitle选项是为脚本中的菜单创建公共标题的简便办法。上表提供的强大特性允许我们创建任何需要的窗口。
dialog命令支持运行时配置。该命令会根据配置文件模板创建一份配置文件。dialog启动时会先去检查是否设置了DIALOGRC环境变量,该变量会保存配置文件名信息。如果未设置该变量或未找到该文件,它会将$HOME/.dialogrc作为配置文件。如果这个文件还不存在的话就尝试查找编译时指定的GLOBALRC文件,也就是/etc/dialogrc。如果还不存在就用编译时的默认值。
在脚本中使用dialog命令
必须记住两件事:
接下来是一个简单的实例,使用dialog部件生成我们之前(上一篇笔记)所创建的系统管理菜单。
wsx@wsx-laptop:~$ cat menu3 #!/bin/bash # using dialog to create a menu temp=$(mktemp -t test.XXXXXX) temp2=$(mktemp -t test2.XXXXXX) function diskspace { df -k > $temp dialog --textbox $temp 20 60 } function whoseon { who > $temp dialog --textbox $temp 20 50 } function menusage { cat /proc/meminfo > $temp dialog --textbox $temp 20 50 } while [ 1 ] do dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2> $temp2 if [ $? -eq 1 ] then break fi selection=$(cat $temp2) case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) dialog --msgbox "Sorry, invalid selection" 10 30 esac done rm -f $temp 2> /dev/null rm -f $temp 2> /dev/null
使用while循环加一个真值常量创建了一个无限循环来显示菜单对话。当执行完每个函数后,脚本会返回继续显示菜单。
脚本使用了mktemp命令创建两个临时文件来保存dialog命令的数据。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。