• 《Linux命令行与shell脚本编程大全》第十八章 图形化桌面环境中的脚本编程


    18.1 创建文本菜单

    直接上例子吧:

      1 #!/bin/bash

      2 function menu

      3 {

      4         clear

      5         echo

      6         echo -e " Sys Admin Menu "

      7         echo -e " 1. Display disk space"

      8         echo -e " 2. Display logged usage"

      9         echo -e " 3. Display memory usage"

     10         echo -e " 0. Exit program"

     11         echo -en " Enter option:"

     12         read -n 1 option

     13 }

     14

     15 function diskspace

     16 {

     17         clear

     18         df -k

     19 }

     20

     21 function whoseon

     22 {

     23         clear

     24         who

     25 }

     26

     27 function memusage

     28 {

     29         clear

     30         cat /proc/meminfo

     31 }

     32

     33 menu

     34 case $option in

     35 0)

     36         echo

     37         echo "Bye!!!" ;;

     38 1)

     39         diskspace ;;

     40 2)

     41         whoseon ;;

     42 3)

     43         memusage ;;

     44 *)

     45         clear

     46         echo "Sorry, wrong selection"

     47 esac

     

    18.1.5 使用select命令

    这个命令可以很轻松的创建出菜单

    格式:

    select variable in list

    do

             commands

    done

     

    list是由空格分隔的文本选项列表,这些列表构成整个菜单。

    select会将每个列表项显示成一个带编号的选项,然后为选项显示一个有PS3环境变量定义的特殊指示符。

    比如:

    1 #!/bin/bash

      2 function diskspace

      3 {

      4         clear

      5         df -k

      6 }

      7

      8 function whoseon

      9 {

     10         clear

     11         who

     12 }

     13

     14 function memusage

     15 {

     16         clear

     17         cat /proc/meminfo

     18 }

     19

     20 PS3="Enter option:"

     21 select option in "Display disk space" "Display logged on user" "Display memory usage" "Exit program"

     22 do

     23         case $option in

     24         "Exit program")

     25                 echo "Bye!!!"

     26                 exit ;;

     27         "Display disk space")

     28                 clear

     29                 diskspace ;;

     30         "Display logged on user")

     31                 clear

     32                 whoseon ;;

     33         "Display memory usage")

     34                 clear

     35                 memusage ;;

     36         *)

     37                 echo "Sorry, Error"

     38         esac

     39 done

     

    18.2 制作窗口

    dialog包是一个小工具。

    这个包可以用ANSI转义控制字符在文本环境中创建标准的窗口对话框。

    Ubuntu中安装:

    sudo apt-get install dialog

     

    18.2.1 dialog

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

    例如:

    $dialog –inputbox “Enter you age:” 10 20 2>age.txt

    部件输出在STDERR中,重定向到age.txt中。

    具体可以通过help 查看。有下面这几项:

     

    每个dialog部件都提供了两种形式的输出:

    使用STDERR   使用退出状态码。

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

    如果用户选择了yesok按钮,返回退出码0。选择了no,则返回退出状态码1

    如果部件返回了数据,比如菜单选择,那么dialog会将数据发送到STDERR。可以把STDERR重定向到一个文件中。

     

    实例:

    1msgbox部件

    在窗口显示一条简单的消息,直到用户单击ok按钮才消失、

     

    2yesno部件

    允许用户对窗口中显示的问题选择yesno。会生成两个按钮。

    用户选择之后可以查看退出码知道用户选的是yes还是no

    $echo $?

     

    3textbox部件

    在窗口中显示大量的信息的极佳办法。会生成一个滚动窗口来显示由参数指定的文本

     

    4menu部件

    创建文本菜单的窗口版本。需要为每个选项指定标号和文本。

    选择的第几个选项可以通过STDERR输出

     

    5fselect部件

    可以用fselect部件来浏览文件的位置并选择文件

    选择的目录在STDERR中。

     

    18.2.2 dialog选项

    可以在dialog命令中定制很多不同的选项。比如之前的 –title

    还有一些其他选项可以全面定制窗口外观和操作。有一个表有说明,表太长了。

     

    18.2.3 在脚本中使用dialog命令

    记住两个注意事项:

    1)如果有cancelno按钮,检查dialog命令的退出状态码

    2)重定向STDERR获得输出值

     

    例子:

      1 #!/bin/bash

      2 # using dialog to create a menu

      3 temp=$(mktemp -t test.XXXXXX)

      4 temp2=$(mktemp -t test2.XXXXXX)

      5

      6 function diskspace

      7 {

      8         df -k > $temp

      9         dialog --textbox $temp 20 80

     10 }

     11

     12 function whoseon

     13 {

     14         who > $temp

     15         dialog --textbox $temp 20 50

     16 }

     17

     18 function menusage

     19 {

     20         cat /proc/meminfo > $temp

     21         dialog --textbox $temp 20 50

     22 }

     23

     24 while [ 1 ]

     25 do

     26         dialog --menu "sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2> $temp2  # 输出值保存在temp2

     27         if [ $? -eq 1 ] # 获取退出状态码,如果失败(1)则退出。

     28         then

     29                 break

     30         fi

     31

     32         selection=$(cat $temp2)

     33         case $selection in

     34         1)

     35                 diskspace ;;

     36         2)

     37                 whoseon ;;

     38         3)

     39                 menusage ;;

     40         0)

     41                 break ;;

     42         *)

     43                 dialog --msgbox "Sorry,invalid selection" 10 30

     44         esac

     45 done

     46

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

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

     总之,dialog就是一个命令(就会有退出状态码),可以接参数,也有输出。

     

    18.3 使用图形

    KDEGNOME桌面环境都扩展了dialog命令的思路,包含了可以在各自环境下生成X windows图形化部件的命令。

    18.3.1 KDE环境

    KDE环境默认包含kdialog包。kdialog使用kdialog命令在KDE桌面上生成类似于dialog式部件的标准窗口

    这个可能需要安装:sudo apt-get install kde-baseapps-bin

    1. kdialog部件:kdialog命令使用命令行选择来指定具体使用哪种类型的窗口,后面再加上相应的参数。

    例子:

    $ kdialog --checklist "Item I need" 1 "Item1" on 2 "Item2" on 3 "Item3" on 4 "Item4" off

    后面接on的表示高亮状态

    kdialog命令会将每个标号作为一个字符串值返回到STDOUT中。(dialog是保存在STDERR中)

     

    2.使用实例:(把之前的例子改一下)在脚本中使用kdialog

      1 #!/bin/bash

      2 # using kkdialog to create a menu

      3 temp=$(mktemp -t test.XXXXXX)

      4 temp2=$(mktemp -t test2.XXXXXX)

      5

      6 function diskspace

      7 {

      8         df -k > $temp

      9         kdialog --textbox $temp 1000 20

     10 }

     11

     12 function whoseon

     13 {

     14         who > $temp

     15         kdialog --textbox $temp 500 10

     16 }

     17

     18 function menusage

     19 {

     20         cat /proc/meminfo > $temp

     21         kdialog --textbox $temp 300 500

     22 }

     23

     24 while [ 1 ]

     25 do

     26         kdialog --menu "sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2

     27         if [ $? -eq 1 ]

     28         then

     29                 break

     30         fi

     31

     32         selection=$(cat $temp2)

     33         case $selection in

     34         1)

     35                 diskspace ;;

     36         2)

     37                 whoseon ;;

     38         3)

     39                 menusage ;;

     40         0)

     41                 break ;;

     42         *)

     43                 kdialog --msgbox "Sorry,invalid selection" 10 30

     44         esac

     45 done

     46

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

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

     

    18.3.2 GNOME环境

    GNOME图形化支持两种流行的可生成标准窗口的包。

    gdialog     zenity

     

    1. zenity部件

    zenity允许用命令行选项创建不同的窗口部件。后面也是接部件名 再加参数

    还提供了一些非常酷的高级对话窗口。

    比如:

    $ zenity –calendar

    $zenity –file-selection

    选择的结果也在STDOUT中。

    实例:也是改之前那个

     

     

      1 #!/bin/bash

      2 # using kzenity to create a menu

      3 temp=$(mktemp -t test.XXXXXX)

      4 temp2=$(mktemp -t test2.XXXXXX)

      5

      6 function diskspace

      7 {

      8         df -k > $temp

      9         echo "Disk space +++"

     10         zenity --text-info --title "Disk space" --filename=$temp --width 800 --height 300

     11 }

     12

     13 function whoseon

     14 {

     15         who > $temp

     16         zenity --text-info --title "whoseon" --filename=$temp --width 800 --height 180

     17 }

     18

     19 function menusage

     20 {

     21         cat /proc/meminfo > $temp

     22         zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 800

     23 }

     24

     25 while [ 1 ]

     26 do

     27         zenity --list  --radiolist --title "sys Admin Menu" --column "select" --column "Menu Item" TRUE "Display disk space" FALSE "Display users" FALSE "Display memory usage" FALSE "Exit" > $temp2

     28         if [ $? -eq 1 ]

     29         then

     30                 break

     31         fi

     32

     33         selection=$(cat $temp2)

     34         case $selection in

     35         "Display disk space")

     36                 diskspace ;;

     37         "Display users")

     38                 whoseon ;;

     39         "Display memory usage")

     40                 menusage ;;

     41         "Exit")

     42                 break ;;

     43         *)

     44                 zenity --info "Sorry,invalid selection" 10 30

     45         esac

     46 done

     47

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

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

  • 相关阅读:
    5.基于文件验证的vsftp虚拟用户
    linux系统用户登录ftp
    4.ftp用户禁锢
    原码,反码,补码
    8map
    命令jhsdb jmap heap pid 1 报错
    20211112_mysql_8.0docker部署踩坑
    Windows 下 tail 查看日志命令工具分享
    前后端java+vue 实现rsa 加解密与摘要签名算法
    优化TTFB 至500ms内
  • 原文地址:https://www.cnblogs.com/xcywt/p/7967021.html
Copyright © 2020-2023  润新知