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

第一部分: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/bash
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:" #-n表示不打印回车
read -n1 option #读取一个字符
echo ""

显示效果:

Menu
1.	Display disk space
2.	Display logged on user
3.	Display memory usage
0.	Exit menu


		Enter option:

创建菜单函数

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

添加菜单逻辑

#!/bin/bash
option=""
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_menu

case $option in
0)
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 list
do
    commands
done

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;;
    esac
done

运行结果:

$ menu_test 
1) Display disk space	   3) Display memory usage
2) Display logged on user  4) Exit menu
Enter 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

《Linux命令行与shell脚本编程大全》 第十七章 学习笔记
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/bash
temp=`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>$temp2
if [ $? -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
    esac
fi

rm -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一样

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

在脚本中使用zenity

#!/bin/bash
temp=`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" > $temp2
if [ $? -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."
    esac
fi

rm -f $temp $temp2 2>/dev/null

zenity不支持菜单对话框

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


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

转贴请保留以下链接

本人blog地址

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

相关推荐