Linux 文字和图形接口程序cialog.docx
《Linux 文字和图形接口程序cialog.docx》由会员分享,可在线阅读,更多相关《Linux 文字和图形接口程序cialog.docx(35页珍藏版)》请在冰豆网上搜索。
Linux文字和图形接口程序cialog
第16章使用ShellScript撰写文字和图形接口程序
dialog是一种在shellscript中建立对话框(dialogbox)的工具,利用dialog可建立不同的信息和问题窗口,增加script的方便性,提高程序的亲和力。
有许多Linux套件的安装程序,就是使用dialog来编写用户界面的,如B2DLinux、SlackwareLinux等。
dialog最初的作者是SavioLam(lam836@cs.cuhk.hk),后来Pako(demarco_p@abramo.it)接手维护,在0.9a版时改名叫cdialog,1999年12月T.Dickey以0.9a为基础推出0.9b的版本,后来就由Dickey持续维护到今天,在cdialog/的项目地址上,仍名为cdialog。
dialog建立的是终端模式下的文本接口,另外有一种和dialog语法兼容的工具叫xdialog,xdialog则是拿来建立Xwindow下的图形接口。
xdialog使用GTK+图形工具来完成各式各样的对话框,可融入不同的桌面主题(desktoptheme)。
xdialog的网址为http:
//xdialog.free.fr/。
除了xdialog之外,还有一个功能也十分强大的图形接口工具,叫zenity。
zenity是改写自老版本的gdialog,zenity套件中有一支使用perl写的gdialog程序,可转换兼容于gdialog的语法。
zneity也是使用GTK+来操作,网址为
本章介绍如何在BashShellScript中,利用dialog和xdialog这两个工具,撰写具亲和力的用户接口程序。
B2D、Debian、Ubuntu的用户,可通过以下指令来安装需要的套件:
1.apt-get update
2.apt-get install dialog xdialog zenity
16.1 使用dialog撰写文本接口程序
(1)
dialog目前支持的对话框功能有:
1.calendar, checklist, form, fselect, gauge, infobox,
inputbox, inputmenu, menu, msgbox
2.(message), password, pause, radiolist, tailbox,
tailboxbg, textbox, timebox, and yesno
3.(yes/no).
这些对话框的语法,至少要有3个参数:
标题或信息内容、窗口的高度、宽度。
除了这3项,不同的对话框可能还需要额外的参数,语法才算完整。
使用者操作对话框之后,如果有输出,通常会转向到标准错误;若有选择,则可以由执行对话框命令结束后的离开状态来判断。
以下介绍常用的对话框的用法。
显示信息(msgbox)
语法:
dialog--msgbox信息内容高度宽度
用途 显示信息。
用例1
1.dialog --msgbox "这是一个测试" 10 40
执行结果:
图16-1 msgbox的执行结果
窗口的按钮只有一个,若使用者按下【Enter】键,则窗口随即结束,离去状态为0;若用户按【Esc】键,窗口也会结束,但离去状态为255。
我们可以用$?
这个变量来检查用户对窗口的反应:
范例 16-1-1:
msgbox1.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. $DIA --msgbox "这是一个测试" 10 40
6.06. x=$?
7.07. if [ "$x" -eq 0 ]; then
8.08. echo '你按了ENTER键'
9.09. elif [ "$x" -eq 255 ]; then
10.10. echo '你按了ESC键'
11.11. else
12.12. echo '未知的错误:
你可能按了Ctrl-C键'
13.13. fi
说明
行3,定义变量DIA为dialog的程序路径和文件名,这样,将来修改script的自由度较高。
行5,显示窗口。
行6,使用变量x接收行5执行后"离去状态变量$?
"的内容。
行7~13,依离去状态值,显示用户按了哪一个键。
以上是对话框的基本用法,在实际应用时,还有3个选项可控制对话框的外观:
--backtitle
出在背景顶部的标题
--title
出现在对话框顶部的标题
--no-shadow
外框不要有阴影的效果
16.1 使用dialog撰写文本接口程序
(2)
用例2
1.dialog --backtitle "设置阶段" --title "注意"
--msgbox "这是一个测试" 10 40
执行结果:
图16-2 --backtitle选项指定的标题,
出现在背后左上角的位置
可以发现--backtitle选项指定的标题,出现在背后左上角的位置;--title选项指定的标题,出现在对话框顶部。
如果范例2再加上--no-shadow的选项,对话框的外框就不会有阴影的效果。
如下所示。
用例3
1.dialog --backtitle "设置阶段" --title "注意"
--no-shadow --msgbox "这是一个测试" 10 40
执行结果:
图16-3 加上--no-shadow的选项,
对话框的外框就不会有阴影的效果
以上这些范例算是对话框的基本型,其他对话框,可视为窗口的变化。
用这种观点,对dialog的各种用法,很快地就可以上手。
是或否对话框(yesno)
语法:
dialog--yesno信息内容高度宽度
用途 显示信息,并询问确定与否。
用例
1.dialog --yesno "要继续吗?
" 10 40
执行结果:
图16-4 是或否对话框(yesno)
依据$?
的值,可判断使用者选择了"是"或"否":
若$?
的值为0,表示使用者选"是"。
若$?
的值为1,表示选"否"。
若$?
的值为255,表示使用者按了【Esc】键,放弃回答。
范例 16-1-2:
yesnobox1.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. CHOICE=''
6.06.
7.07. dialog --yesno "要继续吗?
" 10 40
8.08. x=$?
9.09. if [ "$x" -ne 0 ]; then
10.10. CHOICE='NO'
11.11. fi
12.12.
13.13. if [ -n "$CHOICE" ]; then
14.14. echo '你选择不继续...'
15.15. else
16.16. echo '你选择继续...'
17.17. fi
说明
行9,若$?
不等于0,表示使用者没有选择"是",那么,便设定CHOICE的变量值为NO。
行13,若CHOICE的值不空,表示使用者选"否"。
请注意,信息内容的字符串长度,如果超过对话框设定的宽度,显示时会自动换行。
你也可以在信息字符串中,使用\n来指定要换行的位置。
16.1 使用dialog撰写文本接口程序(3)
多选一对话框(radiolist)
语法:
dialog--radiolist信息内容高宽选项数目选项列表
选项的格式是:
"选项名称选项说明默认是否启用",其中on代表启用,off代表不启用。
选项列表则是由各选项所组成的字符串。
用途 多选一。
用例
范例 16-1-3:
radiolist1.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. TMP="/tmp/radiolist.$$"
6.06. M1="请选择您偏爱的文件系统"
7.07. NUMFS=3
8.08. FSLIST="ext2第2版的扩展文件系统off
ext3第3版的扩展文件系统on ext4
9. 第4版的扩展文件系统off"
10.09.
11.10. $DIA --radiolist "$M1" 10 40 $NUMFS $FSLIST 2> $TMP
12.11.
13.12. FSTYPE=$(cat $TMP)
14.13. [ -z "$FSTYPE" ] && FSTYPE="ext3"
15.14.
16.15. rm -f "$TMP"
17.16.
18.17. echo "您选择的是:
$FSTYPE"
行5,建立一临时文件TMP。
行6,设定M1为欲显示的信息内容。
行7,设定NUMFS为选项数目,这里设为3,表示共有3个选项。
行8,FSLIST是radiolist的选项列表,其格式是:
"选项名称选项说明默认是否启用",这3项彼此之间用空格符隔开,最后一项若是on,则代表默认启用,若是off,则代表不启用。
由于选项数目为3,因此,FSLIST中共有9项,1~3项是ext2的选项设定,off代表ext2默认不启用;4~6项为ext3的选项设定,on代表ext3默认启用;7~9项是ext4的选项设定,off代表ext4默认不启用。
用户可按上下方向键来移动光标位置,按空格键可做选择,按【Tab】键可在"选项"、"确定"、"取消"3个按钮之间移动切换。
行10,使用者的选择,可能是ext2、ext3、ext4这3个"选项名称"之一,默认会由标准错误输出,因此,使用2>把标准错误的输出结果转向存入TMP临时文件中,利用这个方法,我们便可取得用户选择的项目。
行12,取出临时文件TMP的内容,放入变量FSTYPE中。
行13,如果FSTYPE变量内容是空的,为保险起见,给FSTYPE设一个默认值ext3。
行15,删除临时文件。
行17,显示用户所做的选择。
执行结果:
图16-5 多选一对话框
选单对话框(menu)
语法:
dialog--menu信息内容高宽选单高度选项列表
选项的格式是:
"选项名称选项说明"。
选项列表则是由一个或一个以上的选项所组成的字符串。
用途 建立一选单供使用者选择。
--menu和--radiolist的用法差不多,差别在于--menu不指定哪一个选项默认是否启用,且多了一个选项高度。
操作选单对话框,可使用上下箭头键移动光标,各选项的第一个字为热键,可单按选项的第一字符来做选择,或按下1~9的数字键来选择对应的选项。
用户做了选择后,该选项的"选项名称"就是答案,默认会由标准错误输出。
若是加上--help-button选项,则会多出一个求助的按钮,script设计者可借此安排一个说明画面。
若选项的数目超过选单的高度,则会出现滚动条,供用户上下移动选项。
用例
范例 16-1-4:
menu1.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. TMP="/tmp/menu.$$"
6.06. M1="请选择您偏好的文件系统"
7.07. FSLIST="1.ext2第2版的扩展文件系统2.ext3
第3版的扩展文件系统3.ext4
8. 第4版的扩展文件系统"
9.08.
10.09. $DIA --menu "$M1" 10 40 4 $FSLIST 2> $TMP
11.10.
12.11. FSTYPE=$(cat $TMP)
13.12. [ -z "$FSTYPE" ] && FSTYPE="ext3"
14.13.
15.14. rm -f "$TMP"
16.15.
17.16. echo "您选择的是:
$FSTYPE"
行9,对话框的高宽分别是10行和40个字符宽,选单高度是4行,选项列表的内容在FSLIST中。
使用2>把使用者的选择由标准错误转向存入TMP临时文件中。
执行结果:
图16-6 除了用箭头键做选择外,
也可以直接按数字键来做选择
这里,除了上下箭头键之外,也可以单按1、2、3等数字键来做选择,然后按【Enter】键做确定。
16.1 使用dialog撰写文本接口程序(4)
单行输入对话框(inputbox)
语法:
dialog--inputbox信息内容高宽初始值
初始值可以省略。
若有设定初始值,则输入栏中会出现该初始值。
用途 要求用户输入一列字符串。
使用者可在输入栏中,进行输入或各种编辑的动作。
用例
范例 16-1-5:
inputbox1.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. TMP="/tmp/inputbox.$$"
6.06.
7.07. DEFHNAME="sample.edu.tw"
8.08. M1="请设置主机名:
"
9.09.
10.10. $DIA --inputbox "$M1" 10 40 $DEFHNAME 2> $TMP
11.11.
12.12. HNAME=$(cat $TMP)
13.13. [ -z "$HNAME" ] && HNAME=$DEFHNAME
14.14.
15.15. rm -f "$TMP"
16.16.
17.17. echo "你设定的主机名是:
$HNAME"
说明
行7,使用者若没有输入就直接按【Enter】键确定,则默认的主机名就是DEFHNAME的值。
行10,把用户输入的字符串转向存入TMP临时文件中。
行12,取出交换空间的内容,放入变量HNAME中。
行13,若HNAME为空,则把默认的主机名设给HNAME。
行17,显示用户输入的结果。
执行结果:
图16-7 执行结果
输入密码对话框(passwordbox)
语法:
dialog--passwordbox信息内容高宽初始值
初始值可以省略。
若有设定初始值,则输入栏中会出现该初始值。
用途要求用户输入密码。
当用户输入时,默认不会显示出来。
但若有提供初始值,则一开始会出现该初始值。
若在执行dialog时加上--insecure的选项,那么,当用户键入密码时,会以*替代用户输入的字符,出现在输入栏中。
用例1
范例 16-1-6:
passwordbox1.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. TMP="/tmp/passwordbox.$$"
6.06.
7.07. DEFPWD='b2d is best'
8.08. M1="请设置一组密码:
"
9.09.
10.10. $DIA --passwordbox "$M1" 10 40 2> $TMP
11.11.
12.12. PWD=$(cat $TMP)
13.13. [ -z "$PWD" ] && PWD=$DEFPWD
14.14.
15.15. rm -f "$TMP"
16.16.
17.17. echo "你设定的密码是:
$PWD"
列7,设定默认的密码变量DEFPWD。
列10,执行passwordbox,将设定密码的结果存入TMP临时文件中。
列12,取出临时盘的内容,放入变量PWD中。
列13,若PWD为空,则指定默认的密码给PWD。
列17,显示设置的密码。
执行结果:
图16-8 passwordbox1.sh的执行结果
16.1 使用dialog撰写文本接口程序(5)
用例2
以下是加上--insecure选项的范例。
范例 16-1-7:
passwordbox2.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. TMP="/tmp/passwordbox.$$"
6.06.
7.07. DEFPWD='b2d is best'
8.08. M1="请设置一组密码:
"
9.09.
10.10. $DIA --insecure --passwordbox "$M1" 10 40 2> $TMP
11.11.
12.12. PWD=$(cat $TMP)
13.13. [ -z "$PWD" ] && PWD=$DEFPWD
14.14.
15.15. rm -f "$TMP"
16.16.
17.17. echo "你设置的密码是:
$PWD"
执行结果:
图16-9 passwordbox2.sh的执行结果
显示进度对话框(gauge)
语法:
dialog--gauge信息内容高宽初始进度百分比值
初始进度值可以省略,此时其百分比为0。
用途 显示进度百分比的直方图。
--gauge默认会由标准输入读取进度百分比的值,并在对话框中显示对应的进度直方图,当不再读取到任何输入值时(即读到EOF),随即离开此对话框。
用例1
1.dialog --gauge "安装进度..." 10 40 80
这里,设定执行进度百分比为80%。
执行结果:
图16-10 显示进度对话框
不过,上述范例是静态的,作用不大,应改成动态的,较能呈现目前处理的现况。
用例2
范例 16-1-8:
progress1.sh
1. 01. #!
/bin/bash
2. 02.
3. 03. {
4. 04. for ((i=1;i<=10;i++))
5. 05. do
6. 06. let I=10*i
7. 07. echo $I
8. 08. sleep 1
9. 09. done
10. 10.
11.| dialog --guage "安装进度" 5 60 0
行4,使用for循环,i从1到10结束。
行6,把i放大10倍,指定给I。
列7,把进度百分比I显示到标准输出。
行8,为了让进度条有动态的感觉,在这里停顿1秒钟。
行3~10,把for循环的输出,经由管线喂给dailog。
行10,dialog由百分比0开始显示,然后百分之10、20、30…,一直到百分之百,才结束此对话框。
执行结果:
图16-11 progress1.sh的执行结果
16.1 使用dialog撰写文本接口程序(6)
进度条除了往右增长之外,运用循环的技巧,也可以使进度条往左方倒退显示进度。
以下范例,会由0%显示到100%,然后再递减到0%。
用例3
范例16-1-9:
progress2.sh
1.01. #!
/bin/bash
2.02.
3.03. {
4.04. for ((i=1;i<=10;i++))
5.05. do
6.06. let I=10*i
7.07. echo $I
8.08. sleep 1
9.09. done
10.10.
11.11. echo
12.12.
13.13. for ((i=9;i>=0;i--))
14.14. do
15.15. let I=10*i
16.16. echo $I
17.17. sleep 1
18.18. done
19.19.
20. dialog --guage "安装进度" 5 60 0
核查列表对话框(checklist)
语法:
dialog--checklist信息内容高宽核查列表高度核查项目列表
核查项目的格式是:
"选项名称选项说明启用状态"。
on代表启用,off代表不启用。
核查项目列表则是由一个或一个以上的核查项目所组成的字符串。
用途 建立一选单供使用者做多重选择。
--checklist和--menu的用法差不多,差别在于--checklist须指定核查项目默认是否启用,且可多选。
操作核查列表对话框,可使用上下箭头键移动光标,按空格键可进行核查,另外,各选项的的第一个字为热键,可单按选项的第一字符来做选择,或按下1~9的数字键来选择对应的选项。
用户做了选择后,该选项的"选项名称"就是多重选择的答案之一,默认会由标准错误输出,输出时,各选项默认会用双引号含括。
若选项的数目超过列表的高度,则会出现滚动条,供用户上下移动选项。
用例
范例 16-1-10:
checklist1.sh
1.01. #!
/bin/bash
2.02.
3.03. DIA='/usr/bin/dialog'
4.04.
5.05. TMP="/tmp/checklist.$$"
6.06. M1="请选