Dialog是一种在shell script中建立的对框框(dialog box)的工具,利用dialog可建立不同的信息和问题窗口,增加script的方便性,提高程序的亲和力。有许多的Linux套件的安装程序,就是使用dialog编写的用户界面的,如果B2D Linux、Slackware Linux等。
B2D、Debian、Ubuntu的用户,可通过一些指令来安装需要的套件:
apt-get update
apt-get install dialog xdialog zenity
dialog目前使用支持的对话框功能有:
calendar,checklist,form,fselect,gauge,infobox,inputbox,inputmenu,menu,msgbox(message),password,pause,radiolist,tailbox,tailboxbg,textbox,timebox,and yesno(yes/no). |
这些对话框的语法,至少要有3个参数:标题或信息内容、窗口的高度、宽度。除了这3项,不同的对框话可能还需要额外的参数,语法才算完整。
使用者操作对话框之后,如果有输出,通常会转向到标准错误;若有选择,则可以由执行对话框命令结束后的离开状态来判断。
常用的对话框有:
1. 显示信息(msgbox)
语法:diabox –msgbox 信息内容 高度 宽度
用途:显示信息
例如:dialog –msgbox ‘This is a test !’ 10 40
窗口只有一个按钮,若使用者按下[Enter]键,则窗口随即结束,离开状态为0;若用户按[Esc]键,窗口也会结束,但离开状态为255.可以用$?这个变量来检查用户对宽口的反应。
以上对话框的基本用法,在实际应用时,还有3个选项可控制对框的外观:
--backtitle |
出在背景顶部的标题 |
--title |
出现在对话框顶部的标题 |
--no-shadow |
外框不要有阴影的效果 |
例如:dialog --backtitle “设置标题” --title “注意” --no-shadow --msgbox “这是一个测试” 10 40
2. 是否对话框(yesno)
语法:diabox –yesno 信息内容 高度 宽度
用途:显示信息,并询问确定与否。
用例:diabox –yesno “要继续吗?” 10 40
执行结果:
依据$?的值,可判断使用者选择了“是”或“否”;
若$?的值为0,表示使用者选“是”。
若$?的值为1,表示使用者选“否”。
若$?的值为255,表示使用者选择“Esc”,放弃了回答。
注意:信息内容的字符串长度,如果超过了对话框设定的宽度,显示会自动换行。你也可以在信息字符串种,使用\n来指定要换行的位置。
3. 多选一对话框(radiolist)
语法:dialog –radiolist 信息内容 高度 宽度 选项数目 选项列表
选项的格式是:“选项名称 选项说明 默认是否启用”,其中on代表启用,off代表不启用。选项列表则是由各项所组成的字符串。
用途:多选一。
#! /bin/bash DIA="/usr/bin/dialog" TMP="/tmp/radiologlist.$$" M1="请选择你偏爱的文件系统!" NUM=3 FSLIST="ext2 第2代linux文件系统 off ext3 第3代linux文件系统 on ext4 第4代linux操作系统 off" $DIA --radiolist "$M1" 40 40 $NUM $FSLIST 2> $TMP FSTYPE=$(cat $TMP) [ -z "$FSTYPE" ] && FSTYPE="ext3" rm -rf $TMP echo "您选择的是:$FSTYPE" |
注意:在选择的时候,需要安装上下键来选择,空格键确认选择。TAB键来选择“选项”“确定”“返回”。
4. 选单对话框
语法:dialog –menu 信息内容 高度 宽度 选单高度 选项列表
选项的格式:“选项名称 选项说明”。选项列表则是由一个或一个以上的选项所组成的字符串。
用途:建立一选单供使用者使用。
--menu和radiolist的用法差不多,差别于—menu不指定哪一个选项默认是否启用,且多了一个选项高度。操作选单对话框,可是使用上下箭头键移动光标,各选项的第一个字为热键,可单按选项的第一个字符来做选择,或按1~9的数字键来选择对应的选项。用户做了选择之后,该选项的“选项名称”就是答案,默认会有标准错误输出。若是加上—help-button选项,则会多出一个求助的按钮,script设计者可借助此安排一个说明画面。
若选项的数目超过选单的高度,则会出现滚动条,供用户选择。
#! /bin/bash DIA="/usr/bin/dialog" TMP="/tmp/radiologlist.$$" M1="请选择你偏爱的文件系统!" FSLIST="1.ext2 第2代linux文件系统 2.ext3 第3代linux文件系统 3.ext4 第4代linux操作系统 " $DIA --menu "$M1" 40 40 4 $FSLIST 2> $TMP FSTYPE=$(cat $TMP) [ -z "$FSTYPE" ] && FSTYPE="ext3" rm -rf $TMP echo "您选择的是:$FSTYPE" |
5. 但行输入对话框
语法:dialog –inputbox 信息内容 高度 宽度 初始值
初始值可以省略,若有设定初始值,则输入栏中会出现该初始值。
用途:要求用输入一列字符串。使用着可在输入栏中,进行输入或各种编辑的工作。
#!/bin/bash DIA='/usr/bin/dialog' TMP='/tmp/$0.$$' DEFNAME="www.test.com" M1="请输入主机名:" $DIA --inputbox "$M1" 10 40 $DEFNAME 2> $TMP HNAME=$(cat $TMP) [ -z "$HNAME" ] && HNAME=$DEFNAME rm -rf "$TMP" echo "您主机名是:$HNAME" |
6. 输入密码对话框(passwordbox)
语法:dialog --passwordbox 信息内容 高度 宽度 初始值
初始值可以省略。若有设定初始值,则输入栏中会出现该初始值。
用途:要求用户输入密码。
当用户输入时,默认不会显示出来。但若有提供初始值,则一开始会出现该初始值。若再执行diglog时加上--secure的选项,那么,当用户键入密码时,会以*代替用户输入的字符,出现在输入栏中。
#!/bin/bash DIA='/usr/bin/dialog' TMP="/tmp/$0.$$" DEFPWD='b2b is best' M1="请设置一组密码:" $DIA --insecure --passwordbox "M1" 10 40 2> $TMP PWD=$(cat $TMP) [ -z "$PWD" ] && PWD=$DEFPWD rm -rf "$TMP" echo "你设定的密码是: $PWD" |
7. 显示进度对话框(gauge)
语法:dialog –gauge 信息内容 高度 宽度 初始进度百分比值
初始进度值可以省略,此时其百分比为0.
用途:显示进度百分比的直方图 。
--gauge默认会有标准输入读取进度百分比的值,并在对话框中显示对应的进度直方图,当不再读取到任何输入值时(即读到EOF),随即离开此时的对话框。
#!/bin/bash { for ((i=1;i<=10;i++)) do let I=10*i echo $I sleep 1 done } | dialog --gauge "安装进度" 5 60 0 |
8. 核查列表对话框(checklist)
语法:dialog –checklist 信息内容 高度 宽度 核查列表高度 核查项目列表
核查项目的格式是:“选项名称 选项说明 启动状态”。On代表启动,off代表不启用。核查项目列表则是由一个或一个以上的核查项目所组成的字符串。
用途:建立一个选单使用者做多重选择
--checklist和—menu的用法差不多,差别在于—checklist须指定核查项目默认时否启动,且可多选。操作核查项目列表对话框,可使用上下箭头键移动光标,按空格键可进行核查,另外,各选项的恶第一个字为热键,可选按选项的第一个字符来做选择,或按下1~9的数字按键选择对应的选项。用户做了选择后,该选项的“选项名程”就是多重选择的答案之一,默认会由标准错误输出,输出时,各选项默认会引用双引号含括。
若选项的参数超过列表的高度,则会出现滚动条,供用户上下移动选项。
#!/bin/bash DIA='/usr/bin/dialog' TMP="/tmp/$0.??" M1="你偏好的linux文件系统:" CHKLIST="1.ext2 第二代linux文件系统 off 2.ext3 第三代linux文件系统 on 3.ext4 第四代linux文件系统 off" $DIA --separate-output --checklist "$M1" 10 40 5 $CHKLIST 2> $TMP FSTYPE=$(cat $TMP) [ -z "FSTYPE" ] && FSTYPE="ext3" rm -rf $TMP echo "你选择的文件系统是:$FSTYPE" |
如果加上选项—separate-output,那么,用户多重选择的答案会分别输出,不会用双引号含括,其语法如下:
$DIA --separate-output --checklist "$M1" 10 40 5 $CHKLIST 2> $TMP |
如果加上选项—single-quoted,则输出多重选择的答案时,则视需要加上单引号或不加任何引号,其语法如下:
$DIA --single-output –chekclist “$M1 10 40 5 $CHECKLIST 2>$TMP |
9. 文本对话框(textbox)
语法:dialog –textbox 文本区 高 宽
用途:显示文本区内容。
可使用箭头键、PgUP、PgDn或使用vi的h,j,k,l按键发,来滚动显示对话框中的内容。
用例:dialog –textbox b2d.txt 10 40
10. 信息对话框(infobox)
语法:dialog –infobox 信息内容 高 宽
用途:显示信息内容,马上结束对话框。
用例:dialog –infobox “双未完成准备工作” 10 40
11. 调整时间对话框(timebox)
语法:dialog –timebox 信息内容 高 宽 时 分 秒
“时 分 秒”可以省略。若不指定“时 分 秒”,则显示现在的时间。
用途:显示时间,供用户以箭头键和[Tab]键做调整。
用例:dialog –timebox “调整时间”
12. 倒数计时对话框(pause)
语法:dialog –pause 信息内容 高度 宽度 秒数
用途:显示多少秒之后,结束对话框。
用例:diglog –pause “倒数计时” 10 44 10
这里设定倒计数10秒后结束对话框。
13. 选择文本区对话框(fselect)
语法:dialog --fselect 路径文件名 高 宽度
用途:显示某一个路径下的文本区。
用例:dialog --fselect /var/www/index.php 10 40
按[Tab]键可在目录和文件之间切换,按空格键可能在选择路径文本区。