天天看點

《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

  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 檢視。有下面這幾項:

《Linux指令行與shell腳本程式設計大全》第十八章 圖形化桌面環境中的腳本程式設計

每個dialog部件都提供了兩種形式的輸出:

使用STDERR   使用退出狀态碼。

可以通過dialog指令的退出狀态碼來确定使用者選擇的按鈕。

如果使用者選擇了yes或ok按鈕,傳回退出碼0。選擇了no,則傳回退出狀态碼1。

如果部件傳回了資料,比如菜單選擇,那麼dialog會将資料發送到STDERR。可以把STDERR重定向到一個檔案中。

執行個體:

1)msgbox部件

在視窗顯示一條簡單的消息,直到使用者單擊ok按鈕才消失、

《Linux指令行與shell腳本程式設計大全》第十八章 圖形化桌面環境中的腳本程式設計

2)yesno部件

允許使用者對視窗中顯示的問題選擇yes或no。會生成兩個按鈕。

使用者選擇之後可以檢視退出碼知道使用者選的是yes還是no

$echo $?

《Linux指令行與shell腳本程式設計大全》第十八章 圖形化桌面環境中的腳本程式設計

3)textbox部件

在視窗中顯示大量的資訊的極佳辦法。會生成一個滾動視窗來顯示由參數指定的文本

《Linux指令行與shell腳本程式設計大全》第十八章 圖形化桌面環境中的腳本程式設計

4)menu部件

建立文本菜單的視窗版本。需要為每個選項指定标号和文本。

選擇的第幾個選項可以通過STDERR輸出

《Linux指令行與shell腳本程式設計大全》第十八章 圖形化桌面環境中的腳本程式設計

5)fselect部件

可以用fselect部件來浏覽檔案的位置并選擇檔案

選擇的目錄在STDERR中。

《Linux指令行與shell腳本程式設計大全》第十八章 圖形化桌面環境中的腳本程式設計

18.2.2 dialog選項

可以在dialog指令中定制很多不同的選項。比如之前的 –title

還有一些其他選項可以全面定制視窗外觀和操作。有一個表有說明,表太長了。

18.2.3 在腳本中使用dialog指令

記住兩個注意事項:

1)如果有cancel或no按鈕,檢查dialog指令的退出狀态碼

2)重定向STDERR獲得輸出值

例子:

  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

  2 # using kkdialog to create a menu

  9         kdialog --textbox $temp 1000 20

 15         kdialog --textbox $temp 500 10

 21         kdialog --textbox $temp 300 500

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

 27         if [ $? -eq 1 ]

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

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

  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

 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

繼續閱讀