《Linux命令行与shell脚本编程大全》 第十七章 学习笔记

来源:互联网 发布:点钞机升级软件 编辑:程序博客网 时间:2024/06/05 06:21

第一部分:Linux命令行
《Linux命令行与shell脚本编程大全》 第一章:初识Linux shell
《Linux命令行与shell脚本编程大全》 第二章:走进shell
《Linux命令行与shell脚本编程大全》 第三章:基本的bash shell命令
《Linux命令行与shell脚本编程大全》 第四章:更多的bash shell命令
《Linux命令行与shell脚本编程大全》 第五章:使用Linux环境变量
《Linux命令行与shell脚本编程大全》 第六章:理解Linux文件权限
《Linux命令行与shell脚本编程大全》 第七章:管理文件系统
《Linux命令行与shell脚本编程大全》 第八章:安装软件程序
《Linux命令行与shell脚本编程大全》 第九章:使用编辑器

第二部分:shell脚本编程基础
《Linux命令行与shell脚本编程大全》 第十章:构建基本脚本
《Linux命令行与shell脚本编程大全》 第十一章:使用结构化命令
《Linux命令行与shell脚本编程大全》 第十二章:更多的结构化命令
《Linux命令行与shell脚本编程大全》 第十三章:处理用户输入
《Linux命令行与shell脚本编程大全》 第十四章:呈现数据
《Linux命令行与shell脚本编程大全》 第十五章:控制脚本

第三部分:高级shell编程
《Linux命令行与shell脚本编程大全》 第十六章:创建函数
《Linux命令行与shell脚本编程大全》 第十七章:图形化桌面上的脚本编程
《Linux命令行与shell脚本编程大全》 第十八章:初识sed和gawk
《Linux命令行与shell脚本编程大全》 第十九章:正则表达式
《Linux命令行与shell脚本编程大全》 第二十章:sed进阶
《Linux命令行与shell脚本编程大全》 第二十一章:gawk进阶
《Linux命令行与shell脚本编程大全》 第二十二章:使用其他shell

第四部分:高级shell脚本编程主题
《Linux命令行与shell脚本编程大全》 第二十三章:使用数据库
《Linux命令行与shell脚本编程大全》 第二十四章:使用Web
《Linux命令行与shell脚本编程大全》 第二十五章:使用E-mail
《Linux命令行与shell脚本编程大全》 第二十六章:编写脚本实用工具
《Linux命令行与shell脚本编程大全》 第二十七章:shell脚本编程进阶


第十七章:图形化桌面上的脚本编程

 

创建文本菜单

创建菜单布局

#!/bin/bashclear #清屏echo -e "\t\tMenu"echo -e "1.\tDisplay disk space"echo -e "2.\tDisplay logged on user"echo -e "3.\tDisplay memory usage"echo -e "0.\tExit menu\n\n"echo -en "\t\tEnter option:" #-n表示不打印回车read -n1 option #读取一个字符echo ""

显示效果:

Menu1.Display disk space2.Display logged on user3.Display memory usage0.Exit menuEnter option:

创建菜单函数

只需把上面的代码用函数包起来即可

添加菜单逻辑

#!/bin/bashoption=""create_menu(){    clear    echo -e "\t\tMenu"    echo -e "1.\tDisplay disk space"    echo -e "2.\tDisplay logged on user"    echo -e "3.\tDisplay memory usage"    echo -e "0.\tExit menu\n\n"    echo -en "\t\tEnter option:"    read -n1 option    echo ""}create_menucase $option in0)echo "Display disk space";;1)echo "Display logged on user";;2)echo "Display memory usage";;3)echo "Exit menu";;*)echo "error";;esac

添加对应的case即可,之后,我们再来实现相应的函数。

整合shell脚本菜单

首先添加case相应的实现函数

disk_space(){    clear    df -k}whoseon(){    clear    who}menu_usage(){    clear    cat /proc/meminfo}

之后处理case部分

deal_menu(){    case $option in    1)    disk_space;;    2)    whoseon;;    3)    menu_usage;;    0)    echo "Exit menu";;    *) #输入错误,重新输入    echo -e "\nSorry, wrong selection."    echo -en "\n\n\t\tHit any key to continue."    read -n1 option #重新读取菜单选项    deal_menu;;    esac}deal_menu

使用select命令

select命令允许从单个命令行创建菜单,然后再提取输入的答案并自动处理。

select variable in listdo    commandsdone

list参数是构成菜单的空格分割的文本选项列表。

select命令会在列表中将每个选项作为一个编好号的选项显示,然后为选项显示一个特殊的由PS3环境变量定义的提示符。(默认的提示符为#?)

PS3="Enter option:"select option in "Display disk space" "Display logged on user" "Display memory usage" "Exit menu"do    case $option in    "Display disk space")    disk_space;;    "Display logged on user")    whoseon;;    "Display memory usage")    menu_usage;;    "Exit menu")    echo "Exit menu"    break;;    *)    echo -e "\nSorry, wrong selection."    echo -en "\n\n\t\tHit any key to continue."    read -n1 option    deal_menu;;    esacdone

运行结果:

$ menu_test 1) Display disk space   3) Display memory usage2) Display logged on user  4) Exit menuEnter option:

select会自动生成菜单

注意:存储在变量中的结果是整个字符串,不是菜单选项前面的数字

 

使用窗口

安装dialog:sudo apt-get install dialog

dialog包

dialog部件

部件描述calendar提供选择日期的日历checklist显示多个选项(其中每一个选项都能打开或关闭)from构建一个表单(用标签和文本字段来填充)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部件都提供两种格式的输出:

使用STDERR

使用退出状态码

用户选择的按钮决定了dialog命令的退出状态码。如果选择Yes、OK,dialog命令会返回退出状态码0。如果选择了Cancel、NO,dialog命令会返回退出状态码1

可以用标准的$?变量来查看退出状态码

如果部件返回了任何数据,那么dialog命令会将数据发送到STDERR

msgbox部件

dialog --msgbox text height width

可以指定title

dialog --title Testing --msgbox "This is a test" 10 20

yesno部件

dialog --title "Do not lie to me" --yesno "Are you a girl?" 10 20

inputbox部件

dialog --title "Do not lie to me" --inputbox "Enter you age:" 10 20 2>age.txt

textbox部件

dialog --textbox /etc/passwd 15 45

可以显示大量文本,并且可以用方向键、Home、End、PgUp、PgDn等操作

menu部件

dialog --menu "Menu" 20 30 5 1 "A." 2 "B." 3 "C."

上面红色的参数表示菜单栏的高度为5个item高,前面两个参数是dialog的高和宽

fselect部件

dialog --title "select a file" --fselect /etc/ 10 50 2>file.txt


dialog选项

选项描述--add-widget继续下个对话框,直到按下Esc或者Cancel--aspect ratio指定窗口宽度和高度的宽高比--backtitle title指定显示在屏幕顶部背景上的标题(2)--begin x y指定窗口左上角的起始位置--cancel-label label指定Cancel按钮的替代标签--clear用默认对话背景色来清空显示--colors在对话框文本中嵌入ANSI色彩编码--cr-wrap在对话文本中允许使用换行符并强制换行--create-rc file将示例配置文件的内容复制到指定的file文件中(1)--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在password部件中键入时显示星号--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-items修改对话窗口中的制表符的停留位置,使其包括选项列表--yes-label label为Yes按钮执行替代标签

(1)dialog命令支持运行时配置。dialog启动时先去检查是否设置了DIALOGRC环境变量,该变量保存配置文件路径。

如果没有找到,则使用$HOME/.dialogrc。如果这个也不存在,就尝查找编译时指定的GLOBALRC(/etc/dialogrc),如果这个也不存在,就用编译默认值。

(2)--backtitle选项是为了脚本中的菜单创建公共标题的简便办法。如果给每个对话窗口都指定了该选项,那么它在应用中将保持一致。

在脚本中使用dialog命令

这里需要注意两点:

1.如果有Cancel或者No按钮,检查dialog命令的退出状态码

2.重定向STDERR来获得输出值

下面是将之前的代码改用dialog实现

#!/bin/bashtemp=`mktemp -t temp.XXXXXX`temp2=`mktemp -t temp2.XXXXXX`disk_space(){    df -k > $temp    dialog --textbox $temp 20 60}whoseon(){    who > $temp    dialog --textbox $temp 20 50}menu_usage(){    cat /proc/meminfo > $temp    dialog --textbox $temp 20 50}dialog --menu "menu" 20 30 10 1 "Display disk space" 2 "Display logged on user" 3 "Display memory usage" 0 "Exit menu" 2>$temp2if [ $? -ne 1 ]then    selection=`cat $temp2`    case $selection in        1)            disk_space;;        2)            whoseon;;        3)            menu_usage;;        0)    ;;        *)        dialog --msgbox "Sorry, invalid selection" 10 30    esacfirm -f $temp $temp2 2>/dev/null

 

使用图形

KDE环境

安装kdialog

sudo apt-get install kdebase-bin

kdialog部件

和dialog类似,命令格式为:

kdialog display-options window-options arguments

window-options选项允许指定使用那种类型的窗口。

kdialog窗口选项

选项描述--checklist title [tag item status]多选列表菜单,状态会说明该选项是否被选定--error text错误消息框--inputbox text [init]输入文本框。可以用init指定默认值--menu title [tag item]带有标题的菜单选择框,以及用tag标识的选项列表--msgbox text显示指定文件的简单消息框--password text隐藏用户输入的密码输入文本框--radiolist title [tag item status]单选列表菜单,状态会说明该选项是否被选定--separate-output为多选列表和单选列表菜单返回按行分开的选项--sorry text“抱歉”消息框--textbox file [width] [height]显示file的内容的文本框,另外指定了width和height--title title为对话窗口的TitleBar区域指定一个标题--warningyesno text带有Yes和No按钮的警告消息框--warningcontinuecancel text带有Continue和Cancel按钮的警告消息框--warningyesnocancel text带有Yes、No和Cancel按钮的警告消息框--yesno text带有Yes和No按钮的提问框--yesnocancel text带有Yes、No和Cancel按钮的提问框

checklist和radiolist允许你在列表中定义单独的选项以及他们默认是否选定

使用kdialog

kdialog与dialog最大的不同就是kdialog将输出重定向到了STDOUT中。

GNOME环境

zenity部件

zenity窗口部件

选项描述--calendar显示整月日历--entry显示文本输入对话窗口--error显示错误消息对话窗口--file-selection显示完整的路径名和文件名对话窗口--info显示信息对话窗口--list显示多选列表或单选列表对话窗口--notification显示通知图标--process显示进度条对话窗口--question显示yes/no对话窗口--scale显示可调整大小的窗口--text-info显示含有文本的文本框--warning显示警告对话窗口

zenity提供的窗口就比之前的dialog效果好多了

zenity --calendar

当选择了日期之后,zenity会将值返回到STDOUT中,和kdialog一样

在脚本中使用zenity

#!/bin/bashtemp=`mktemp -t temp.XXXXXX`temp2=`mktemp -t temp2.XXXXXX`disk_space(){    df -k > $temp    zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 300}whoseon(){    who > $temp    zenity --text-info --title "Logged on user" --filename=$temp --width 500 --height 200}menu_usage(){    cat /proc/meminfo > $temp    zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 500}zenity --list --radiolist --title "Menu" --column "Select" \--column "Menu Item" FALSE "Display disk space" FALSE "Display logged on user" FALSE "Display memory usage" FALSE "Exit" > $temp2if [ $? -ne 1 ]then    selection=`cat $temp2`    case $selection in        "Display disk space")            disk_space;;        "Display logged on user")            whoseon;;        "Display memory usage")            menu_usage;;        "Exit")    ;;        *)        zenity --info "Sorry. invalid selection."    esacfirm -f $temp $temp2 2>/dev/null

zenity不支持菜单对话框




 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

原创粉丝点击