《Linux命令列與shell指令碼編程大全》圖形化案頭上的指令碼編程 建立文本菜單建立菜單布局[plain] #!/bin/bash clear #清屏 echo -e "\t\tMenu" echo -e "1.\tDisplay disk space" echo -e "2.\tDisplay logged on user" echo -e "3.\tDisplay memory usage" echo -e "0.\tExit menu\n\n" echo -en "\t\tEnter option:" #-n表示不列印斷行符號 read -n1 option #讀取一個字元 echo "" 顯示效果:[plain] Menu 1. Display disk space 2. Display logged on user 3. Display memory usage 0. Exit menu Enter option: 建立菜單函數只需把上面的代碼用函數包起來即可添加菜單邏輯[plain] #!/bin/bash option="" create_menu(){ clear echo -e "\t\tMenu" echo -e "1.\tDisplay disk space" echo -e "2.\tDisplay logged on user" echo -e "3.\tDisplay memory usage" echo -e "0.\tExit menu\n\n" echo -en "\t\tEnter option:" read -n1 option echo "" } create_menu case $option in 0) echo "Display disk space";; 1) echo "Display logged on user";; 2) echo "Display memory usage";; 3) echo "Exit menu";; *) echo "error";; esac 添加對應的case即可,之後,我們再來實現相應的函數。整合shell指令碼菜單首先添加case相應的實現函數[plain] disk_space(){ clear df -k } whoseon(){ clear who } menu_usage(){ clear cat /proc/meminfo } 之後處理case部分[plain] deal_menu(){ case $option in 1) disk_space;; 2) whoseon;; 3) menu_usage;; 0) echo "Exit menu";; *) #輸入錯誤,重新輸入 echo -e "\nSorry, wrong selection." echo -en "\n\n\t\tHit any key to continue." read -n1 option #重新讀取菜單選項 deal_menu;; esac } deal_menu 使用select命令select命令允許從單個命令列建立菜單,然後再提取輸入的答案並自動處理。[plain] select variable in list do commands done list參數是構成菜單的空格分割的文本選項列表。select命令會在列表中將每個選項作為一個編好號的選項顯示,然後為選項顯示一個特殊的由PS3環境變數定義的提示符。(預設的提示符為#?)[plain] PS3="Enter option:" select option in "Display disk space" "Display logged on user" "Display memory usage" "Exit menu" do case $option in "Display disk space") disk_space;; "Display logged on user") whoseon;; "Display memory usage") menu_usage;; "Exit menu") echo "Exit menu" break;; *) echo -e "\nSorry, wrong selection." echo -en "\n\n\t\tHit any key to continue." read -n1 option deal_menu;; esac done 運行結果:[plain] $ menu_test 1) Display disk space 3) Display memory usage 2) Display logged on user 4) Exit menu Enter option: select會自動產生菜單注意:儲存在變數中的結果是整個字串,不是菜單選項前面的數字 使用視窗安裝dialog:sudo apt-get install dialogdialog包dialog組件組件 描述calendar 提供選擇日期的日曆checklist 顯示多個選項(其中每一個選項都能開啟或關閉)from 構建一個表單(用標籤和文字欄位來填充)fselect 提供一個檔案選擇視窗來瀏覽選擇檔案gauge 顯示完成的百分比進度條infobox 顯示一條訊息,但不用等待回應inputbox 提供一個輸入文本用的文本表單inputmenu 提供一個可編輯的菜單menu 顯示可選擇的一些列選項msgbox 顯示一條訊息,並要求使用者選擇OK按鈕pause 顯示一個進度條來顯示特定暫訂時間的狀態passwordbox 顯示一個文字框來輸入文本,但會隱藏輸入的文本passwordform 顯示一個帶標籤和隱藏文本輸入的表單radiolist 提供一組菜單選項,但只能選擇其中一個tailbox 用tail命令在滾動視窗中顯示檔案的內容tailboxbg 跟tailbox一樣,但是在後台模式中運行textbox 在滾動視窗中顯示檔案的內容timebox 提供一個選擇小時、分鐘和秒數的視窗yesno 提供一條簡單的帶Yes和No按鈕的訊息dialog --widget parameterswidget是上面的組件,parameters是組件視窗大小、所需文本等每個dialog組件都提供兩種格式的輸出:使用STDERR使用退出狀態代碼使用者選擇的按鈕決定了dialog命令的退出狀態代碼。如果選擇Yes、OK,dialog命令會返回退出狀態代碼0。如果選擇了Cancel、NO,dialog命令會返回退出狀態代碼1可以用標準的$?變數來查看退出狀態代碼如果組件返回了任何資料,那麼dialog命令會將資料發送到STDERRmsgbox組件dialog --msgbox text height width可以指定titledialog --title Testing --msgbox "This is a test" 10 20yesno組件dialog --title "Do not lie to me" --yesno "Are you a girl?" 10 20inputbox組件dialog --title "Do not lie to me" --inputbox "Enter you age:" 10 20 2>age.txttextbox組件dialog --textbox /etc/passwd 15 45可以顯示大量文本,並且可以用方向鍵、Home、End、PgUp、PgDn等操作menu組件dialog --menu "Menu" 20 30 5 1 "A." 2 "B." 3 "C."上面紅色的參數表示功能表列的高度為5個item高,前面兩個參數是dialog的高和寬fselect組件dialog --title "select a file" --fselect /etc/ 10 50 2>file.txt dialog選項選項 描述--add-widget 繼續下個對話方塊,直到按下Esc或者Cancel--aspect ratio 指定視窗寬度和高度的寬高比--backtitle title 指定顯示在螢幕頂部背景上的標題(2)--begin x y 指定視窗左上方的起始位置--cancel-label label 指定Cancel按鈕的替代標籤--clear 用預設對話背景色來清空顯示--colors 在對話方塊文本中嵌入ANSI色彩編碼--cr-wrap 在對話文本中允許使用分行符號並強制換行--create-rc file 將樣本設定檔的內容複寫到指定的file檔案中(1)--defaultno 將yes/no對話的預設答案設定為no--default-item string 設定複選列表,表單或菜單對話中的預設項--exit-label label 指定Exit按鈕的替代標籤--extra-button 在OK按鈕和Cancel按鈕中顯示一個額外按鈕--extra-label label 指定額外按鈕的替代標籤--help 顯示dialog命令的協助資訊--help-button 在OK按鈕和Cancel按鈕後顯示一個Help按鈕--help-label label 指定Help按鈕的替代標籤--help-status 當選定Help按鈕時,會在協助資訊後寫入多選列表、單選列表或表單資訊--ignore 忽略dialog不能識別的選項--input-fd fd 指定另一個檔案描述符,而不是STDIN--insecure 在password組件中鍵入時顯示星號--item-help 為多選列表,單選列表或菜單中的每個標號在螢幕的底部添加一個協助欄--keep-window 不要清除螢幕上顯示過的組件--max-input size 指定輸入的最大字元長度。預設為2048--nocancel 隱藏Cancel按鈕--no-collapse 在對話文本中不要將定位字元轉換成空格--no-kill 將tailboxbg對話放到後台,並禁止該進程的SIGHUP訊號--no-label label 為No按鈕指定替代標籤--no-shadow 不要顯示交談視窗的投影效果--ok-label label 指定OK按鈕的替代標籤--output-fd fd 指定另一個輸出檔案描述符,而不是STDERR--print-maxsize 將交談視窗的最大尺寸列印到輸出中--print-size 將每個交談視窗的大小列印到輸出中--print-version 將dialog的版本列印到輸出中--separate-output 一次一行地輸出checklist組件的結果而不用引號--separator string 為每個組件指定分割輸出的字串--separate-widget string 為每個組件指定分割輸出的字串--shadow 在每個視窗的右下角繪製陰影--single-quoted 需要時對多選列表的輸出採用單引號--sleep sec 在處理完交談視窗之後延遲指定的秒數--stderr 將輸出發送到STDERR(預設即是如此)--stdout 將輸出發送到STDOUT--tab-correct 將定位字元轉換成空格--tab-len n 指定一個定位字元佔用的空格數(預設為8)--timeout sec 指定無使用者輸入的話,sec秒後退出並返回錯誤碼--title title 指定交談視窗的標題--trim 從對話文本中刪除前面是空格和分行符號--visit-items 修改交談視窗中的定位字元的停留位置,使其包括選項列表--yes-label label 為Yes按鈕執行替代標籤(1)dialog命令支援運行時配置。dialog啟動時先去檢查是否設定了DIALOGRC環境變數,該變數儲存設定檔路徑。如果沒有找到,則使用$HOME/.dialogrc。如果這個也不存在,就嘗尋找編譯時間指定的GLOBALRC(/etc/dialogrc),如果這個也不存在,就用編譯預設值。(2)--backtitle選項是為了指令碼中的菜單建立公用標題的簡便辦法。如果給每個交談視窗都指定了該選項,那麼它在應用中將保持一致。在指令碼中使用dialog命令這裡需要注意兩點:1.如果有Cancel或者No按鈕,檢查dialog命令的退出狀態代碼2.重新導向STDERR來獲得輸出值下面是將之前的代碼改用dialog實現[plain] #!/bin/bash temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` disk_space(){ df -k > $temp dialog --textbox $temp 20 60 } whoseon(){ who > $temp dialog --textbox $temp 20 50 } menu_usage(){ cat /proc/meminfo > $temp dialog --textbox $temp 20 50 } dialog --menu "menu" 20 30 10 1 "Display disk space" 2 "Display logged on user" 3 "Display memory usage" 0 "Exit menu" 2>$temp2 if [ $? -ne 1 ] then selection=`cat $temp2` case $selection in 1) disk_space;; 2) whoseon;; 3) menu_usage;; 0) ;; *) dialog --msgbox "Sorry, invalid selection" 10 30 esac fi rm -f $temp $temp2 2>/dev/null 使用圖形KDE環境安裝kdialogsudo apt-get install kdebase-binkdialog組件和dialog類似,命令格式為:kdialog display-options window-options argumentswindow-options選項允許指定使用那種類型的視窗。kdialog視窗選項選項 描述--checklist title [tag item status] 多選列表菜單,狀態會說明該選項是否被選定--error text 錯誤訊息框--inputbox text [init] 輸入文字框。可以用init指定預設值--menu title [tag item] 帶有標題的菜單選擇框,以及用tag標識的選項列表--msgbox text 顯示指定檔案的簡單訊息框--password text 隱藏使用者輸入的密碼輸入文字框--radiolist title [tag item status] 單選列表菜單,狀態會說明該選項是否被選定--separate-output 為多選列表和單選列表菜單返回按行分開的選項--sorry text “抱歉”訊息框--textbox file [width] [height] 顯示file的內容的文字框,另外指定了width和height--title title 為交談視窗的TitleBar地區指定一個標題--warningyesno text 帶有Yes和No按鈕的警告訊息框--warningcontinuecancel text 帶有Continue和Cancel按鈕的警告訊息框--warningyesnocancel text 帶有Yes、No和Cancel按鈕的警告訊息框--yesno text 帶有Yes和No按鈕的提問框--yesnocancel text 帶有Yes、No和Cancel按鈕的提問框checklist和radiolist允許你在列表中定義單獨的選項以及他們預設是否選定使用kdialogkdialog與dialog最大的不同就是kdialog將輸出重新導向到了STDOUT中。GNOME環境zenity組件zenity視窗組件選項 描述--calendar 顯示整月日曆--entry 顯示文本輸入交談視窗--error 顯示錯誤訊息交談視窗--file-selection 顯示完整的路徑名和檔案名稱交談視窗--info 顯示資訊交談視窗--list 顯示多選列表或單選列表交談視窗--notification 顯示通知表徵圖--process 顯示進度條交談視窗--question 顯示yes/no交談視窗--scale 顯示可調整大小的視窗--text-info 顯示含有文本的文字框--warning 顯示警告交談視窗zenity提供的視窗就比之前的dialog效果好多了zenity --calendar當選擇了日期之後,zenity會將值返回到STDOUT中,和kdialog一樣 在指令碼中使用zenity[plain] #!/bin/bash temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` disk_space(){ df -k > $temp zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 300 } whoseon(){ who > $temp zenity --text-info --title "Logged on user" --filename=$temp --width 500 --height 200 } menu_usage(){ cat /proc/meminfo > $temp zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 500 } zenity --list --radiolist --title "Menu" --column "Select" \ --column "Menu Item" FALSE "Display disk space" FALSE "Display logged on user" FALSE "Display memory usage" FALSE "Exit" > $temp2 if [ $? -ne 1 ] then selection=`cat $temp2` case $selection in "Display disk space") disk_space;; "Display logged on user") whoseon;; "Display memory usage") menu_usage;; "Exit") ;; *) zenity --info "Sorry. invalid selection." esac fi rm -f $temp $temp2 2>/dev/null zenity不支援菜單對話方塊