第一部分: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 "		Menu"
    echo -e "1.	Display disk space"
    echo -e "2.	Display logged on user"
    echo -e "3.	Display memory usage"
    echo -e "0.	Exit menu
    
    "
    echo -en "		Enter 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 "		Menu"
        echo -e "1.	Display disk space"
        echo -e "2.	Display logged on user"
        echo -e "3.	Display memory usage"
        echo -e "0.	Exit menu
    
    "
        echo -en "		Enter 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 "
    Sorry, wrong selection."
        echo -en "
    
    		Hit 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 "
    Sorry, wrong selection."
        echo -en "
    
    		Hit 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


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

    在脚本中使用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不支持菜单对话框




    转贴请保留以下链接

    本人blog地址

    http://su1216.iteye.com/

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