• 十三、图形化桌面环境脚本编程


    创建菜单布局

    echo -e选项可以输出制表符和换行符

    echo -en选项会去掉末尾换行符,这样光标会一直在行尾等待用户输入。

    然后使用read -n 1 option限制只读取第一个字符

    [root@tzPC 18Unit]# cat test1.sh 
    #!/bin/bash
    clear
    echo
    echo -e "		tSys Admin Menu
    "
    echo -e "	1. Display disk space"
    echo -e "	2. Display logged on users"
    echo -e "	3. Display memory usage"
    echo -e "	0. Exit menu
    
    "
    echo -en "		Enter option:"
    read -n 1 option

    这样菜单布局运行的结果是

     创建菜单函数

    为每个菜单选项都创建独立的函数。

    可以为还没有实现功能的函数创建一个桩函数,说明这个函数的用途。

    function diskspace {
        clear
        echo "This is where the diskspace commands will go"
    }

    可以将菜单布局本身写入函数

    function menu {
        clear
        echo
        echo -e "		tSys Admin Menu
    "
        echo -e "	1. Display disk space"
        echo -e "	2. Display logged on users"
        echo -e "	3. Display memory usage"
        echo -e "	0. Exit menu
    
    "
        echo -en "		Enter option:"
        read -n 1 option
    }

    添加菜单逻辑

    使用case命令处理命令行参数

    menu #先打印菜单布局
    case $option in
    0)
        break ;;
    1)
        diskpace ;;
    2)
        whoseon ;;
    3)
        memusage ;;
    *)
        clear
        echo "Sorry, wrong selection" ;;
    esac

    组后将各个部分整合成一个脚本

    [root@tzPC 18Unit]# cat test1.sh
    #!/bin/bash
    #simple script menu
    function diskspace {
        clear
        df -k
    }
    
    function whoseon {
        clear
        who
    }
    
    function memusage {
        clear
        cat /proc/meminfo
    }
    
    function menu {
        clear
        echo
        echo -e "		tSys Admin Menu
    "
        echo -e "	1. Display disk space"
        echo -e "	2. Display logged on users"
        echo -e "	3. Display memory usage"
        echo -e "	0. Exit menu
    
    "
        echo -en "		Enter option:"
        read -n 1 option
    }
    
    while [ 1 ] #一直循环菜单
    do
        menu #使用menu函数打印菜单
        case $option in
        0) break ;;
        1) diskspace ;;
        2) whoseon ;;
        3) memusage ;;
        *)  clear
            echo "Sorry, wrong selection" ;;
        esac
        echo -en "
    
    			Hit any key to continue"
        read -n 1 line
    done
    clear

    这个脚本很炫,可以自己写一下试一下。

    使用select命令写菜单布局

    语法格式

    select variable in list
    do
        commands
    done

    lis参数是由空格分隔的文本选项列表,select会将每个列表前加上一个编号。

    将上面的脚本略微改动

    [root@tzPC 18Unit]# cat test2.sh 
    #!/bin/bash
    #simple script menu
    function diskspace {
        clear
        df -k
    }
    
    function whoseon {
        clear
        who
    }
    
    function memusage {
        clear
        cat /proc/meminfo
    }
    
    PS3="Enter option:" 
    select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program"
    do
        case $option in
        "Exit program") break ;;
        "Display disk space") diskspace ;;
        "Display logged on users") whoseon ;;
        "Display memory usage") memusage ;;
        *)  clear
            echo "Sorry, wrong selection" ;;
        esac
    done
    clear

     注意上面的PS3变量

    PS3 是Prompt String 3的缩写,它是Linux/Unix下的一个用于控制select命令创建的菜单提示信息的环境变量,如果不写那么提示语句的位置会变成?符号

     制作窗口

    dialog包可以创建标准的窗口对话框。

    dialog命令使用命令行参数来决定生成哪种窗口部件。

    dialog部件参数在书P384,太多我不想打,哈哈,不懂的要学会自己找man~

    语法格式

    dialog --widget parameters

    其中widget为部件名

    parameters定义窗口的大小以及部件需要的文本

    每个部件输出方式

    1. 使用STDERR文件描述符
    2. 使用退出状态码

    通过dialog命令的退出状态码确定用户选择的按钮

    dialog命令的退出状态码为0,说明用户选择了yes按钮

    退出状态码为1,用户选择的no按钮

    状态码值可用$?变量确定

    部件返回的数据会发送到STDERR文件描述符可通过重定向到文件或者其他文件描述符获知

    [root@tzPC 18Unit]# dialog --inputbox "Enter your age:" 10 20 2> age.txt

     可以重定向到文件看到值20,并且没有换行符

    [root@tzPC 18Unit]# cat age.txt 
    20[root@tzPC 18Unit]# 

     msgbox部件

    在窗口显示一条消息,点击OK才会消失

    语法格式

    dialog --msgbox text height width

     --title参数在窗口顶部写一个标题

    [root@tzPC 18Unit]# dialog --title Testing --msgbox "This is a test" 10 20

     

     yesno部件

    扩展了msgbox部件的功能,多了yes跟no按钮

    [root@tzPC 18Unit]# dialog --title "Please answer" --yesno "Is this thing on?" 10 20

     

     此时如果选择了yes退出码就为0,选择no退出码为1

    [root@tzPC 18Unit]# echo $?
    0

     inputbox部件

    多一个文本框用来输入文本,输入的文本会发送给STDERR,需要重定向才能获取文本框里的值。

    上面的例子写过。

    textbox部件

    显示大量信息,会生成一个滚动的窗口显示由参数所指定的文件

    [root@tzPC 18Unit]# dialog --textbox /etc/passwd 15 45

     menu部件

    创建文本菜单窗口

    [root@tzPC 18Unit]# dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk spac" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2>test.txt

    --menu:定义菜单的标题

    20:高

    30:宽

    10:窗口中一次显示菜单项的总数

    这里书中有误,dialog命令会将选定的菜单项的标号发送到STDERR

     fselect部件

    浏览文件位置并选择文件

    [root@tzPC 18Unit]# dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt

    fselect选项后的第一个参数是窗口中使用的起始目录位置,fselect部件窗口左侧文本框里显示的目录列表,右侧文本框里显示的是该目录下的文件列表,可以在底部的文本框中手动输入文件名或者目录使用空格选定。

    注意:鼠标点击没用。

    最后重定向到file.txt的值为底部文本框内的值。

     dialog选项

    除了部件,dialog命令还支持很多选项,P390,太多了我不写,略略略。

    其中--backtitle选项给把标题写在脚本背景左上角上,看起来更专业点。

    [root@tzPC 18Unit]# dialog --backtitle "Select a file" --fselect $HOME/ 10 50 2>file.txt

     

     在脚本中使用dialog命令

    记住使用dialog命令需要检查两样东西

    • 由yes/no按钮需要检查退出状态码
    • 重定向STDERR来获得输出值
    [root@tzPC 18Unit]# cat menu3.sh 
    #!/bin/bash
    #using dialog to create a menu
    temp=$(mktemp -t test.XXXXXX)
    temp2=$(mktemp -t test2.XXXXXX)
    
    function diskspace {
        df -k > $temp
        dialog --texbox $temp 20 60
    }
    
    function whoseon {
        who > $temp
        dialog --textbox $temp 20 50
    }
    
    function memusage {
        cat /proc/meminfo > $temp
        dialog --textbox $temp 20 50
    }
    
    while [ 1 ]
    do
    dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2>$temp2
    
    if [ $? -eq 1 ];then
        break
    fi
    
    selection=$(cat $temp2)
    case $selection in 
    1)diskspace ;;
    2)whoseon ;;
    3)memusage ;;
    0)break ;;
    *)dialog --msgbox "Sorry, invalid selection" 10 30
    esac 
    done
    
    rm -rf $temp 2>/dev/null
    rm -rf $temp2 2>/dev/null

    脚本效果很炫酷,值得一试!

    其他桌面版图形化编程

    KDE环境

    默认包含kdialog包,使用kdialog命令在KDE桌面生成类似dialog部件窗口。

    这个作为了解,实际生产环境中不会安装图形化界面。

    P393

    GNOME环境

    支持两种可生成标准窗口的包

    • gdialog
    • zenity

    P396

     学习来自:《Linux命令行与Shell脚本大全 第3版》第18章

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    C#设计模式-原型模式
    C#设计模式-建造者模式
    c#设计模式-组合模式
    c#设计模式-适配器模式
    c#设计模式-命令模式
    c#设计模式-观察者模式
    c#设计模式-工厂方法
    C#设计模式-简单工厂
    C#设计模式-工厂模式
    C#设计模式-单例模式
  • 原文地址:https://www.cnblogs.com/tz90/p/13546300.html
Copyright © 2020-2023  润新知