时间:2017年12月4日周一注:本文部分内容摘自《Linux命令行与shell脚本编程大全》一书,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第18章学习总结第18章:在图形化桌面环境中编写脚本本章内容创建文本菜单创建文本小部件添加XWindow图形18.1创建文本菜单创建交互式Shell脚本最常用的方法就是使用菜单.shell脚本菜单的核心是case命令。case命令会根据用户在菜单上的选择执行特定的命令。18.1.1创建菜单布局常用命令clear清除出现在屏幕上的文本。echo-e在echo命令中输出格式化的字符串,以方便菜单项的布局。最后等待用户输入read-n1使用read命令-n选项将自读限制为一个字符简单示例clearechoecho-e"\t\t\tSysAdminMenu\n"echo-e"\t1.显示磁盘空间"echo-e"\t2.显示登录用户"echo-e"\t3.显示内存使用情况"echo-e"\t4.退出菜单\n\n"echo-en"\t\t进入选项:"read-n1option18.1.2创建菜单函数shell脚本菜单选项作为一组独立的函数更容易实现通过为还没有实现的函数创建存根函数来布局,为每个菜单选项创建独立的shell函数菜单本身作为创建一个简单示例的函数functiondiskspace{clearecho"Thisiswherethediskspacecommandswillgo"}functionmenu{clearechoecho-e"\t\t\tSysAdminMenu\n"echo-e"\t1.显示磁盘空间"echo-e"\t2.显示登录用户"echo-e"\t3.显示内存使用情况"echo-e"\t4.退出菜单\n\n"echo-en"\t\t输入选项:"read-n1option}18.1.3添加菜单逻辑创建程序逻辑结合菜单布局和功能case命令根据菜单中输入的字符调用相应的功能使用星号(*)处理所有不正确的菜单项简单示例menucase$optionin0)break;;1)diskspace;;2)whoson;;3)memusage;;*)clearecho"Sorry,wrongselection";;esac18.1.4Integrateshellscriptmenu完整示例Writemenu1script#!/bin/bashfunctiondiskspace{cleardf-k}functionwhoseon{clearwho}functionmemusagee{clearcat/proc/meminfo}functionmenu{clearechoecho-e"\t\t\tSysAdminMenu\n"echo-e"\t1.显示磁盘空间"echo-e"\t2.显示登录用户"echo-e"\t3.显示内存使用情况"echo-e"\t0.退出菜单\n\n"echo-en"\t\t输入选项:"read-n1option}while[1]domenucase$optionin0)break;;1)磁盘空间;;2)谁的;;3)记忆;;*)清除回显“抱歉,选择错误”;;esacecho-en"\n\n\t\t\tHitanykeytocontinue"read-n1linedoneclear18.1.5使用select命令命令格式:selectvariableinlistdocommandsdone命令说明:list参数是以空格分隔的文本选项列表,这些列表构成了整个菜单select命令获取输入的答案并自动处理Writesmenu1script#!/bin/bashfunctiondiskspace{cleardf-k}functionwhoseon{clearwho}functionmemusagee{clearcat/proc/meminfo}PS3="进入选项:"在“显示磁盘空间”中选择选项“显示登录用户”“显示内存使用情况”“退出程序”docase$optionin"Exitprogram")break;;"显示磁盘空间")diskspace;;"显示登录用户")whose;;“显示内存使用情况”)记忆;;*)clearecho"抱歉,选择错误";;esacdoneclear18.2productionWindows18.2.1dialogpackagedialog命令使用命令行参数来确定生成哪些widgets安装dialog包和需要的库sudoapt-getinstalldialogdialog部分:descriptioncalendar:提供一个用于选择日期checklist的日历:显示多个选项(每个选项都可以打开或关闭)form:构建一个带有标签和文本字段的表单(可以填写)fselect:提供一个文件选择窗口来浏览和选择文件guage:显示百分比完成进度条信息框:显示条消息,但不等待响应输入框:提供用于输入文本的文本表单输入菜单:提供可编辑的菜单菜单:显示可供选择的选项列表消息框:显示消息并询问用户选择确定按钮暂停:显示进度条以showthestatusofthetentativeperiodpasswordbox:显示一个文本框,但隐藏输入的文本passwordform:显示一个带有标签的表单,隐藏稳定字段radiolist:提供一组菜单选项,但只能选择其中一个tailbox:使用tail命令在滚动窗口中显示文件内容tailboxbg:与tailbox相同,但以后台模式运行textbox:在滚动窗口中显示文件内容timebox:提供选择小时、分钟和秒的窗口yesno:提供一个带有Yes的窗口No按钮的简单消息使用格式dialog–widgetparameters1.msgbox组件使用说明dialog–titleTesting–msgboxtextheightwidthtext参数是显示在窗口中的字符串dialog命令会自动换行根据高度和宽度参数创建的窗口大小的行title参数指定窗口的标题。Exampledialog--titleTesting--msgbox"Thisisatest"10202.Yesno组件使用说明Yesno组件允许用户对窗口中显示的问题选择是或否。用户选择No按钮,退出状态码为1;如果选择Yes按钮,退出状态代码为0Instancedialog--title"Pleaseanswer"--yesno"Isthisthingon?"10203.inputbox组件指令inputbox提供一个简单的文本框区域来输入文本字符串对话框命令将文本字符串的值发送到STDERR,并通过重定向STDERR获取用户输入。用户选择OK按钮,退出状态码为0;否则,退出状态码为1。实例对话框--inputbox"Enteryourage:"10202>age.txt4.textbox组件使用说明textbox组件在窗口实例对话框中显示大量信息--textbox/etc/passwd15455.menu组件使用说明menu组件用于创建文本菜单的窗口versiondialog命令会将选中的菜单项文本发送到STDERR,通过重定向STDERR获取选中的实例dialog--menu"SysAdminMenu"2030101"显示显示kspace"2"显示用户"3"显示内存使用情况"4"退出"2>test.txt6.fselect组件使用说明使用fselect组件浏览文件所在位置和选择文件实例对话框--title"选择一个file"--fselect$HOME/10502>file.txt18.2.2dialog选项dialog命令有很多不同的选项--title选项设置窗口顶部的标题--backlist选项创建一个通用的标题对于脚本中的菜单和很多其他的选项,此处省略18.2.3在脚本中使用对话框命令如果要在脚本中使用对话框命令,必须遵守以下规范如果有取消或否按钮,查看dialog命令的退出状态码通过重定向STDERR获取输出值使用dialog组件创建系统管理菜单编写menu3脚本#!/bin/bashtemp1=$(mktemp-ttest1.XXXXXX)temp2=$(mktemp-ttest2.XXXXXX)functiondiskspace{dialog--textbox$temp12060}functionwhoson{who>$temp1dialog--textbox$temp12050}functionmemusage{cat/proc/meminfo>$temp1dialog--textbox$temp1}2050}while[1]dodialog--menu"SysAdminMenu"2030101"显示磁盘空间"2"显示用户"3"显示内存使用情况"0"退出"2>$temp2if[$?-eq1]thenbreakfiselection=$(cat$temp2)case$selectionin1)diskspace;;2)谁的;;3)记忆;;0)中断;;*)dialog--msgbox"Sorry,invalidselection"1030esacdonerm-f$temp12>/dev/nullrm-f$temp22>/dev/null18.3使用图形18.3.1KDE环境KDE图形环境包括默认情况下的kdialog包。kdialog包使用kdialog命令在KDE桌面上生成类似于对话框样式组件的标准窗口。需要检查系统是否安装了kdialog包。1.Kdialog组件指令格式:kdialogdisplay-optionswindow-optionsargumentswindow-options选项指定使用哪种类型的widget实例:kdialog--checklist"ItemsIneed"1"Toothbrush"on2"Toothpaste"off3"毛刷”on4“除臭剂”off5“拖鞋”offkdialog窗口选项选项:描述--checklisttitle[tagitemstatus]:多选列表菜单,有状态,可以表明该选项是否被选中--error文本:错误messagebox--inputboxtext[init]:输入文本框。init值可以用来做默认值--menutitle[tagitem]:带有标题的菜单选择框,以及由tag标识的选项列表--msgboxtext:显示指定文本的简单消息框--passwordtext:隐藏用户输入的密码输入文本框--radiolisttitle[tagitemstatus]:带状态的单选列表菜单,可以表示选项是否被选中--separate-output:返回多选列表和单选列表菜单行分隔选项--sorrytext:“对不起”消息框--textboxfile[width][height]:显示文件内容的文本框,宽高均可指定--title标题:对话框窗口的标题Bar区域指定标题--warningyesno文本:带有是和否按钮的警告消息框--warningcontinuecancel文本:带有继续和取消按钮的警告消息框--warningyesnocancel文本:带有是、否和取消按钮的警告消息box--yesno文本:带有是和否按钮的问题框--yesnocancel文本:带有是、否和取消按钮的问题框2.使用kdialog使用kdialog创建系统管理菜单Writemenu4script#!/bin/bashtemp1=$(mktemp-ttest1.XXXXXX)temp2=$(mktemp-ttest2.XXXXXX)functiondiskspace{df-k>$temp1kdialog--textbox$temp1100010}functionwhoson{who>$temp1kdialog--文本框$temp150010}functionmemusage{cat/proc/meminfo>$temp1kdialog--textbox$temp1300500}while[1]dokdialog--menu"SysAdminMenu""1""显示磁盘空间""2""显示用户""3""显示内存使用情况""0""退出">$temp2if[$?-eq1]thenbreakfiselection=$(cat$temp2)case$selectionin1)diskspace;;2)谁的;;3)记忆;;0)中断;;*)kdialog--msgbox"抱歉,选择无效"1030esacdonerm-f$temp12>/dev/nullrm-f$temp22>/dev/null18.3.2GNOME环境GNOME图形环境支持两个生成标准窗口gdialogzenity1.zenityzenity小部件选项的流行包:description--calendar:显示完整的月历--entry:显示文本输入对话框窗口--error:显示错误消息对话框窗口--file-selection:显示完整的路径名和文件名对话框窗口--info:显示信息对话框窗口--list:显示多选列表或单选列表对话框窗口--notification:显示通知图标--progress:显示进度条对话框窗口--question:显示是/否对话框窗口--scale:显示aresizablewindow--text-info:显示包含文本的文本框--waring:显示警告对话框窗口2.使用zenity在脚本中编写menu5脚本#!/bin/bashtemp1=$(mktemp-ttest1.XXXXXX)temp2=$(mktemp-ttest2.XXXXXX)functiondiskspace{df-k>$temp1zenity--text-info--title"磁盘空间"--filename=$temp1--width750--height10}functionwhoson{who>$temp1zenity--text-info--title"Loggedinusers"--filename=$temp1--width500--height10}functionmemusage{cat/proc/meminfo>$temp1zenity--text-info--title"内存使用情况"--filename=$temp1--width300--height500}while[1]dozenity--list--radiolist--title"SysAdminMenu"--column"Select"--column"MenuItem"FALSE"Displaydiskspace"FALSE"Displayusers"FALSE"Displaymemoryusage"FALSE"Exit">$temp2if[$?-eq1]thenbreakfiselection=$(cat$temp2)case$selectionin"Displaydiskspace")diskspace;;"显示用户")whose;;“显示内存使用情况”)记忆;;退出)中断;;*)zenity--info"Sorry,invalidselection"1030esacdonerm-f$temp12>/dev/nullrm-f$temp22>/dev/null18.4总结本章主要讲解如何在shell脚本中创建菜单和在图形环境中编写交互式脚本
