《Linux命令行與shell腳本編程大全》 第十七章 學習筆記

第一部分:Linux命令行
《Linux命令行與shell腳本編程大全》 第一章:初識Linux shell
《Linux命令行與shell腳本編程大全》 第二章:走進shell
《Linux命令行與shell腳本編程大全》 第三章:基本的bash shell命令
《Linux命令行與shell腳本編程大全》 第四章:更多的bash shell命令
《Linux命令行與shell腳本編程大全》 第五章:使用Linux環境變量
《Linux命令行與shell腳本編程大全》 第六章:理解Linux文件權限
《Linux命令行與shell腳本編程大全》 第七章:管理文件系統
《Linux命令行與shell腳本編程大全》 第八章:安裝軟件程序
《Linux命令行與shell腳本編程大全》 第九章:使用編輯器

第二部分:shell腳本編程基礎
《Linux命令行與shell腳本編程大全》 第十章:構建基本腳本
《Linux命令行與shell腳本編程大全》 第十一章:使用結構化命令
《Linux命令行與shell腳本編程大全》 第十二章:更多的結構化命令
《Linux命令行與shell腳本編程大全》 第十三章:處理用戶輸入
《Linux命令行與shell腳本編程大全》 第十四章:呈現數據
《Linux命令行與shell腳本編程大全》 第十五章:控制腳本

第三部分:高級shell編程
《Linux命令行與shell腳本編程大全》 第十六章:創建函數
《Linux命令行與shell腳本編程大全》 第十七章:圖形化桌面上的腳本編程
《Linux命令行與shell腳本編程大全》 第十八章:初識sed和gawk
《Linux命令行與shell腳本編程大全》 第十九章:正則表達式
《Linux命令行與shell腳本編程大全》 第二十章:sed進階
《Linux命令行與shell腳本編程大全》 第二十一章:gawk進階
《Linux命令行與shell腳本編程大全》 第二十二章:使用其他shell

第四部分:高級shell腳本編程主題
《Linux命令行與shell腳本編程大全》 第二十三章:使用數據庫
《Linux命令行與shell腳本編程大全》 第二十四章:使用Web
《Linux命令行與shell腳本編程大全》 第二十五章:使用E-mail
《Linux命令行與shell腳本編程大全》 第二十六章:編寫腳本實用工具
《Linux命令行與shell腳本編程大全》 第二十七章:shell腳本編程進階


第十七章:圖形化桌面上的腳本編程

 

創建文本菜單

創建菜單佈局

#!/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 ""

顯示效果:

		Menu
1.	Display disk space
2.	Display logged on user
3.	Display memory usage
0.	Exit menu


		Enter option:

創建菜單函數

只需把上面的代碼用函數包起來即可

添加菜單邏輯

#!/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相應的實現函數

disk_space(){
    clear
    df -k
}

whoseon(){
    clear
    who
}

menu_usage(){
    clear
    cat /proc/meminfo
}

之後處理case部分

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命令允許從單個命令行創建菜單,然後再提取輸入的答案並自動處理。

select variable in list
do
    commands
done

list參數是構成菜單的空格分割的文本選項列表。

select命令會在列表中將每個選項作爲一個編好號的選項顯示,然後爲選項顯示一個特殊的由PS3環境變量定義的提示符。(默認的提示符爲#?)

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

運行結果:

$ 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 dialog

dialog包

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 parameters

widget是上面的部件,parameters是部件窗口大小、所需文本等

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

使用STDERR

使用退出狀態碼

用戶選擇的按鈕決定了dialog命令的退出狀態碼。如果選擇Yes、OK,dialog命令會返回退出狀態碼0。如果選擇了Cancel、NO,dialog命令會返回退出狀態碼1

可以用標準的$?變量來查看退出狀態碼

如果部件返回了任何數據,那麼dialog命令會將數據發送到STDERR

msgbox部件

dialog --msgbox text height width

可以指定title

dialog --title Testing --msgbox "This is a test" 10 20

yesno部件

dialog --title "Do not lie to me" --yesno "Are you a girl?" 10 20

inputbox部件

dialog --title "Do not lie to me" --inputbox "Enter you age:" 10 20 2>age.txt

textbox部件

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實現

#!/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環境

安裝kdialog

sudo apt-get install kdebase-bin

kdialog部件

和dialog類似,命令格式爲:

kdialog display-options window-options arguments

window-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允許你在列表中定義單獨的選項以及他們默認是否選定

使用kdialog

kdialog與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

#!/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不支持菜單對話框




 

轉貼請保留以下鏈接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章