18.1 创建文本菜单

直接上例子吧:

1 #!/bin/bash
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 
function
 16 {
 17         clear
 18         df -k
 19 }
 20 
function
 22 {
 23         clear
 24         who
 25 }
 26 
function
 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 
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 查看。有下面这几项:

 

linux下java图形化开发 linux图形化编程_操作系统

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

使用STDERR   使用退出状态码。

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

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

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

 

实例:

1)msgbox部件

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

 

linux下java图形化开发 linux图形化编程_shell_02

2)yesno部件

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

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

$echo $?

 

linux下java图形化开发 linux图形化编程_linux下java图形化开发_03

3)textbox部件

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

 

linux下java图形化开发 linux图形化编程_bash_04

4)menu部件

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

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

 

linux下java图形化开发 linux图形化编程_shell_05

5)fselect部件

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

选择的目录在STDERR中。

 

linux下java图形化开发 linux图形化编程_状态码_06

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
dialog --textbox $temp 20 80
 10 }
 11 
 12 function whoseon
 13 {
 14         who > $temp
dialog --textbox $temp 20 50
 16 }
 17 
 18 function menusage
 19 {
 20         cat /proc/meminfo > $temp
dialog --textbox $temp 20 50
 22 }
 23 
 24 while [ 1 ]
 25 do
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         *)
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
kdialog
 10 }
 11 
 12 function whoseon
 13 {
 14         who > $temp
kdialog
 16 }
 17 
 18 function menusage
 19 {
 20         cat /proc/meminfo > $temp
kdialog
 22 }
 23 
 24 while [ 1 ]
 25 do
kdialog --menu "sys Admin Menu" "1""2""3""0"> $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         *)
kdialog
 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 +++"
 zenity --text-info --title "Disk space" --filename=$temp --width 800 --height 300
 11 }
 12 
 13 function whoseon
 14 {
 15         who > $temp
 zenity --text-info --title "whoseon" --filename=$temp --width 800 --height 180
 17 }
 18 
 19 function menusage
 20 {
 21         cat /proc/meminfo > $temp
  zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 800
 23 }
 24 
 25 while [ 1 ]
 26 do
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         *)
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