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

18.1 创建文本菜单

直接上例子吧:

   1 #!/bin/bash
   2 function menu
   3 {
   4         clear
   5         echo
   6         echo -e "\t\t\tSys Admin Menu\n"
   7         echo -e "\t1. Display disk space"
   8         echo -e "\t2. Display logged usage"
   9         echo -e "\t3. Display memory usage"
  10         echo -e "\t0. Exit program"
  11         echo -en "\t\t 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命令的退出状态码来确定用户选择的按钮。

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

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

实例:

1)msgbox部件

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

2)yesno部件

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

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

$echo $?

3)textbox部件

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

4)menu部件

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

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

5)fselect部件

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

选择的目录在STDERR中。

18.2.2 dialog选项

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

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

18.2.3 在脚本中使用dialog命令

记住两个注意事项:

1)如果有cancel或no按钮,检查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 使用图形

KDE和GNOME桌面环境都扩展了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
 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木子墨的前端日常

Vue-Router模式、钩子

上一篇主要写了一下vuer-router的基本使用,可以说解决温饱了,下面就再来点下午茶吧

12820
来自专栏北京马哥教育

玩转Linux - 神级工具 sed & awk

简介 本文主要介绍 Linux 系统的两个神级工具:sed 和 awk ,他们是Linux高手们必备的技能,很值得我们去研究的东西。 这里是我在网上书上收集的相...

36280
来自专栏猛牛哥的博客

aardio v13.7 更新内容

16330
来自专栏优启梦

Chrome控制台console的基本用法

大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的,因为它对于调试脚本及前端设计调试都有它比其它浏...

470120
来自专栏我分享我快乐

解决IE不支持HTML5的办法

解决IE不支持HTML5的办法,有3种,如下: 第一种方法(原理:识别标签): 引用Google的html5.js文件到head部分,记住一定要是head部分(...

35690
来自专栏IT探索

excel

2. 在excel2007中打开mysql导出utf-8编码的csv文件,避免乱码:

13610
来自专栏Youngxj

Chrome控制台console的基本用法

21850
来自专栏一个会写诗的程序员的博客

正则表达式 删除 Java 代码中的注释

想如何删掉所有java 或xml 中的注释,还在寻找eclipse 中的快捷键了吗,你out了,现在都用正则表达式了、

23940
来自专栏葡萄城控件技术团队

1000多个项目中的十大JavaScript错误以及如何避免

通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。 对于这些错误发...

38040
来自专栏Puppeteer学习

Puppeteer实现选择性截图

截图的代码很简单,比如如果我想实现对百度搜索框部分截图怎么做呢,查询page.screenshot api 可以看到其api说明中包含clip 选项,用于设置截...

2.4K80

扫码关注云+社区

领取腾讯云代金券