使用dialog撰寫文本接口程序

轉自:http://book.51cto.com 2010-03-28 15:01 臥龍小

· 摘要:《實戰Linux Shell編程與服務器管理》第16章使用Shell Script撰寫文字和圖形接口程序,本章介紹如何在Bash Shell Script中,利用dialog和xdialog這兩個工具,撰寫具親和力的用戶接口程序。本節爲大家介紹使用dialog撰寫文本接口程序。

第16使用Shell Script撰寫文字和圖形接口程序

dialog是一種在shell script中建立對話框(dialog box)的工具,利用dialog可建立不同的信息和問題窗口,增加script的方便性,提高程序的親和力。有許多Linux套件的安裝程序,就是使用 dialog來編寫用戶界面的,如B2D Linux、Slackware Linux等。

dialog最初的作者是Savio Lam([email protected]),後來Pako([email protected])接手維護,在0.9a版時改名叫cdialog,1999年12月T.Dickey <[email protected]> 以0.9a爲基礎推出0.9b的版本,後來就由Dickey持續維護到今天,在http://freshmeat.net/projects/ cdialog/的項目地址上,仍名爲cdialog。

dialog建立的是終端模式下的文本接口,另外有一種和dialog語法兼容的工具叫xdialog,xdialog則是拿來建立X window下的圖形接口。xdialog使用GTK+圖形工具來完成各式各樣的對話框,可融入不同的桌面主題(desktop theme)。xdialog的網址爲http://xdialog.free.fr/

除了xdialog之外,還有一個功能也十分強大的圖形接口工具,叫zenity。zenity是改寫自老版本的gdialog,zenity套件 中有一支使用perl寫的gdialog程序,可轉換兼容於gdialog的語法。zneity也是使用GTK+ 來操作,網址爲http://freshmeat.net/projects/zenity

本章介紹如何在Bash Shell Script中,利用dialog和xdialog這兩個工具,撰寫具親和力的用戶接口程序。

B2D、Debian、Ubuntu的用戶,可通過以下指令來安裝需要的套件:

1 apt-get update

2 apt-get install dialog xdialog zenity

16.1 使用dialog撰寫文本接口程序(1

dialog目前支持的對話框功能有:

3 calendar, checklist, form, fselect, gauge, infobox,
inputbox, inputmenu, menu, msgbox

4 (message), password, pause, radiolist, tailbox,
tailboxbg, textbox, timebox, and yesno

5 (yes/no).

這些對話框的語法,至少要有3個參數:標題或信息內容、窗口的高度、寬度。除了這3項,不同的對話框可能還需要額外的參數,語法纔算完整。

使用者操作對話框之後,如果有輸出,通常會轉向到標準錯誤;若有選擇,則可以由執行對話框命令結束後的離開狀態來判斷。

以下介紹常用的對話框的用法。

顯示信息(msgbox)

語法:dialog --msgbox信息內容 高度 寬度

用途 顯示信息。

用例1

6 dialog --msgbox "這是一個測試" 10 40

執行結果:

clip_image001

圖16-1 msgbox的執行結果

窗口的按鈕只有一個,若使用者按下【Enter】鍵,則窗口隨即結束,離去狀態爲0;若用戶按【Esc】鍵,窗口也會結束,但離去狀態爲255。我們可以用$?這個變量來檢查用戶對窗口的反應:

範例 16-1-1:msgbox1.sh

7 01. #! /bin/bash

8 02.

9 03. DIA='/usr/bin/dialog'

10 04.

11 05. $DIA --msgbox "這是一個測試" 10 40

12 06. x=$?

13 07. if [ "$x" -eq 0 ]; then

14 08. echo '你按了ENTER鍵'

15 09. elif [ "$x" -eq 255 ]; then

16 10. echo '你按了ESC鍵'

17 11. else

18 12. echo '未知的錯誤: 你可能按了Ctrl-C鍵'

19 13. fi

說明

行3,定義變量DIA爲dialog的程序路徑和文件名,這樣,將來修改script的自由度較高。

行5,顯示窗口。

行6,使用變量x接收行5執行後"離去狀態變量$?"的內容。

行7~13,依離去狀態值,顯示用戶按了哪一個鍵。

以上是對話框的基本用法,在實際應用時,還有3個選項可控制對話框的外觀:

16.1 使用dialog撰寫文本接口程序(2

用例2

1 dialog --backtitle "設置階段" --title "注意"
--msgbox "這是一個測試" 10 40

執行結果:

clip_image002

圖16-2 --backtitle選項指定的標題,
出現在背後左上角的位置

可以發現--backtitle選項指定的標題,出現在背後左上角的位置;--title選項指定的標題,出現在對話框頂部。

如果範例2再加上--no-shadow的選項,對話框的外框就不會有陰影的效果。如下所示。

用例3

2 dialog --backtitle "設置階段" --title "注意"
--no-shadow --msgbox "這是一個測試" 10 40

執行結果:

clip_image003

圖16-3 加上 --no-shadow的選項,
對話框的外框就不會有陰影的效果

以上這些範例算是對話框的基本型,其他對話框,可視爲窗口的變化。用這種觀點,對dialog的各種用法,很快地就可以上手。

是或否對話框(yesno)

語法:dialog --yesno信息內容 高度 寬度

用途 顯示信息,並詢問確定與否。

用例

3 dialog --yesno "要繼續嗎?" 10 40

執行結果:

clip_image004

圖16-4 是或否對話框(yesno)

依據$?的值,可判斷使用者選擇了"是"或"否":

若$?的值爲0,表示使用者選"是"。

若$?的值爲1,表示選"否"。

若$?的值爲255,表示使用者按了【Esc】鍵,放棄回答。

範例 16-1-2:yesnobox1.sh

4 01. #! /bin/bash

5 02.

6 03. DIA='/usr/bin/dialog'

7 04.

8 05. CHOICE=''

9 06.

10 07. dialog --yesno "要繼續嗎?" 10 40

11 08. x=$?

12 09. if [ "$x" -ne 0 ]; then

13 10. CHOICE='NO'

14 11. fi

15 12.

16 13. if [ -n "$CHOICE" ]; then

17 14. echo '你選擇不繼續...'

18 15. else

19 16. echo '你選擇繼續...'

20 17. fi

說明

行9,若$?不等於0,表示使用者沒有選擇"是",那麼,便設定CHOICE的變量值爲NO。

行13,若CHOICE的值不空,表示使用者選"否"。

請注意,信息內容的字符串長度,如果超過對話框設定的寬度,顯示時會自動換行。你也可以在信息字符串中,使用/n來指定要換行的位置。

16.1 使用dialog撰寫文本接口程序(3

多選一對話框(radiolist

語法:dialog --radiolist信息內容 高 寬 選項數目 選項列表

選項的格式是:"選項名稱 選項說明 默認是否啓用",其中on代表啓用,off代表不啓用。選項列表則是由各選項所組成的字符串。

用途 多選一。

用例

範例 16-1-3:radiolist1.sh

1 01. #! /bin/bash

2 02.

3 03. DIA='/usr/bin/dialog'

4 04.

5 05. TMP="/tmp/radiolist.$$"

6 06. M1="請選擇您偏愛的文件系統"

7 07. NUMFS=3

8 08. FSLIST="ext2第2版的擴展文件系統off
ext3第3版的擴展文件系統on ext4

9 第4版的擴展文件系統off"

10 09.

11 10. $DIA --radiolist "$M1" 10 40 $NUMFS $FSLIST 2> $TMP

12 11.

13 12. FSTYPE=$(cat $TMP)

14 13. [ -z "$FSTYPE" ] && FSTYPE="ext3"

15 14.

16 15. rm -f "$TMP"

17 16.

18 17. echo "您選擇的是: $FSTYPE"

行5,建立一臨時文件TMP。

行6,設定M1爲欲顯示的信息內容。

行7,設定NUMFS爲選項數目,這裏設爲3,表示共有3個選項。

行8,FSLIST是radiolist的選項列表,其格式是:"選項名稱 選項說明 默認是否啓用",這3項彼此之間用空格符隔開,最後一項若是on,則代表默認啓用,若是off,則代表不啓用。由於選項數目爲3,因此,FSLIST中共 有9項,1~3項是ext2的選項設定,off代表ext2默認不啓用;4~6項爲ext3的選項設定,on代表ext3默認啓用;7~9項是ext4的 選項設定,off代表ext4默認不啓用。用戶可按上下方向鍵來移動光標位置,按空格鍵可做選擇,按【Tab】鍵可在"選項"、"確定"、"取消"3個按 鈕之間移動切換。

行10,使用者的選擇,可能是ext2、ext3、ext4這3個"選項名稱"之一,默認會由標準錯誤輸出,因此,使用2>把標準錯誤的輸出結果轉向存入TMP臨時文件中,利用這個方法,我們便可取得用戶選擇的項目。

行12,取出臨時文件TMP的內容,放入變量FSTYPE中。

行13,如果FSTYPE變量內容是空的,爲保險起見,給FSTYPE設一個默認值ext3。

行15,刪除臨時文件。

行17,顯示用戶所做的選擇。

執行結果:

clip_image005

圖16-5 多選一對話框

選單對話框(menu)

語法:dialog --menu信息內容 高 寬 選單高度 選項列表

選項的格式是:"選項名稱 選項說明"。選項列表則是由一個或一個以上的選項所組成的字符串。

用途 建立一選單供使用者選擇。

--menu和--radiolist的用法差不多,差別在於--menu不指定哪一個選項默認是否啓用,且多了一個選項高度。操作選單對話框,可 使用上下箭頭鍵移動光標,各選項的第一個字爲熱鍵,可單按選項的第一字符來做選擇,或按下1~9的數字鍵來選擇對應的選項。用戶做了選擇後,該選項的"選 項名稱"就是答案,默認會由標準錯誤輸出。若是加上--help-button選項,則會多出一個求助的按鈕,script設計者可藉此安排一個說明畫 面。

若選項的數目超過選單的高度,則會出現滾動條,供用戶上下移動選項。

用例

範例 16-1-4:menu1.sh

19 01. #! /bin/bash

20 02.

21 03. DIA='/usr/bin/dialog'

22 04.

23 05. TMP="/tmp/menu.$$"

24 06. M1="請選擇您偏好的文件系統"

25 07. FSLIST="1.ext2第2版的擴展文件系統2.ext3
第3版的擴展文件系統3.ext4

26 第4版的擴展文件系統"

27 08.

28 09. $DIA --menu "$M1" 10 40 4 $FSLIST 2> $TMP

29 10.

30 11. FSTYPE=$(cat $TMP)

31 12. [ -z "$FSTYPE" ] && FSTYPE="ext3"

32 13.

33 14. rm -f "$TMP"

34 15.

35 16. echo "您選擇的是: $FSTYPE"

行9,對話框的高寬分別是10行和40個字符寬,選單高度是4行,選項列表的內容在FSLIST中。使用2>把使用者的選擇由標準錯誤轉向存入TMP臨時文件中。

執行結果:

clip_image006

圖16-6 除了用箭頭鍵做選擇外,
也可以直接按數字鍵來做選擇

這裏,除了上下箭頭鍵之外,也可以單按1、2、3等數字鍵來做選擇,然後按【Enter】鍵做確定。

16.1 使用dialog撰寫文本接口程序(4

單行輸入對話框(inputbox)

語法:dialog --inputbox信息內容 高 寬 初始值

初始值可以省略。若有設定初始值,則輸入欄中會出現該初始值。

用途 要求用戶輸入一列字符串。使用者可在輸入欄中,進行輸入或各種編輯的動作。

用例

範例 16-1-5:inputbox1.sh

1 01. #! /bin/bash

2 02.

3 03. DIA='/usr/bin/dialog'

4 04.

5 05. TMP="/tmp/inputbox.$$"

6 06.

7 07. DEFHNAME="sample.edu.tw"

8 08. M1="請設置主機名:"

9 09.

10 10. $DIA --inputbox "$M1" 10 40 $DEFHNAME 2> $TMP

11 11.

12 12. HNAME=$(cat $TMP)

13 13. [ -z "$HNAME" ] && HNAME=$DEFHNAME

14 14.

15 15. rm -f "$TMP"

16 16.

17 17. echo "你設定的主機名是: $HNAME"

說明

行7,使用者若沒有輸入就直接按【Enter】鍵確定,則默認的主機名就是DEFHNAME的值。

行10,把用戶輸入的字符串轉向存入TMP臨時文件中。

行12,取出交換空間的內容,放入變量HNAME中。

行13,若HNAME爲空,則把默認的主機名設給HNAME。

行17,顯示用戶輸入的結果。

執行結果:

clip_image007

圖16-7 執行結果

輸入密碼對話框(passwordbox)

語法:dialog --passwordbox信息內容 高 寬 初始值

初始值可以省略。若有設定初始值,則輸入欄中會出現該初始值。

用途 要求用戶輸入密碼。

當用戶輸入時,默認不會顯示出來。但若有提供初始值,則一開始會出現該初始值。若在執行dialog時加上--insecure的選項,那麼,當用戶鍵入密碼時,會以*替代用戶輸入的字符,出現在輸入欄中。

用例1

範例 16-1-6:passwordbox1.sh

18 01. #! /bin/bash

19 02.

20 03. DIA='/usr/bin/dialog'

21 04.

22 05. TMP="/tmp/passwordbox.$$"

23 06.

24 07. DEFPWD='b2d is best'

25 08. M1="請設置一組密碼:"

26 09.

27 10. $DIA --passwordbox "$M1" 10 40 2> $TMP

28 11.

29 12. PWD=$(cat $TMP)

30 13. [ -z "$PWD" ] && PWD=$DEFPWD

31 14.

32 15. rm -f "$TMP"

33 16.

34 17. echo "你設定的密碼是: $PWD"

列7,設定默認的密碼變量DEFPWD。列10,執行passwordbox,將設定密碼的結果存入TMP臨時文件中。

列12,取出臨時盤的內容,放入變量PWD中。

列13,若PWD爲空,則指定默認的密碼給PWD。

列17,顯示設置的密碼。

執行結果:

clip_image008

圖16-8 passwordbox1.sh的執行結果

16.1 使用dialog撰寫文本接口程序(5

用例2

以下是加上--insecure選項的範例。

範例 16-1-7:passwordbox2.sh

1 01. #! /bin/bash

2 02.

3 03. DIA='/usr/bin/dialog'

4 04.

5 05. TMP="/tmp/passwordbox.$$"

6 06.

7 07. DEFPWD='b2d is best'

8 08. M1="請設置一組密碼:"

9 09.

10 10. $DIA --insecure --passwordbox "$M1" 10 40 2> $TMP

11 11.

12 12. PWD=$(cat $TMP)

13 13. [ -z "$PWD" ] && PWD=$DEFPWD

14 14.

15 15. rm -f "$TMP"

16 16.

17 17. echo "你設置的密碼是: $PWD"

執行結果:

clip_image009

圖16-9 passwordbox2.sh的執行結果

顯示進度對話框(gauge)

語法:dialog --gauge信息內容 高 寬 初始進度百分比值

初始進度值可以省略,此時其百分比爲0。

用途 顯示進度百分比的直方圖。

--gauge默認會由標準輸入讀取進度百分比的值,並在對話框中顯示對應的進度直方圖,當不再讀取到任何輸入值時(即讀到EOF),隨即離開此對話框。

用例1

18 dialog --gauge "安裝進度..." 10 40 80

這裏,設定執行進度百分比爲80%。

執行結果:

clip_image010

圖16-10 顯示進度對話框

不過,上述範例是靜態的,作用不大,應改成動態的,較能呈現目前處理的現況。

用例2

範例 16-1-8:progress1.sh

19 01. #! /bin/bash

20 02.

21 03. {

22 04. for ((i=1;i<=10;i++))

23 05. do

24 06. let I=10*i

25 07. echo $I

26 08. sleep 1

27 09. done

28 10.

29 | dialog --guage "安裝進度" 5 60 0

行4,使用for循環,i從1到10結束。

行6,把i放大10倍,指定給I。

列7,把進度百分比I顯示到標準輸出。

行8,爲了讓進度條有動態的感覺,在這裏停頓1秒鐘。

行3~10,把for循環的輸出,經由管線餵給dailog。

行10,dialog由百分比0開始顯示,然後百分之10、20、30…,一直到百分之百,才結束此對話框。

執行結果:

clip_image011

圖16-11 progress1.sh的執行結果

【責任編輯:雲霞 TEL:(010)68476606】

16.1 使用dialog撰寫文本接口程序(6

進度條除了往右增長之外,運用循環的技巧,也可以使進度條往左方倒退顯示進度。以下範例,會由0%顯示到100%,然後再遞減到0%。

用例3

範例 16-1-9:progress2.sh

1 01. #! /bin/bash

2 02.

3 03. {

4 04. for ((i=1;i<=10;i++))

5 05. do

6 06. let I=10*i

7 07. echo $I

8 08. sleep 1

9 09. done

10 10.

11 11. echo

12 12.

13 13. for ((i=9;i>=0;i--))

14 14. do

15 15. let I=10*i

16 16. echo $I

17 17. sleep 1

18 18. done

19 19.

20 dialog --guage "安裝進度" 5 60 0

覈查列表對話框(checklist)

語法:dialog --checklist信息內容 高 寬 覈查列表高度 覈查項目列表

覈查項目的格式是:"選項名稱 選項說明 啓用狀態"。on代表啓用,off代表不啓用。覈查項目列表則是由一個或一個以上的核查項目所組成的字符串。

用途 建立一選單供使用者做多重選擇。

--checklist和--menu的用法差不多,差別在於--checklist須指定覈查項目默認是否啓用,且可多選。操作覈查列表對話框, 可使用上下箭頭鍵移動光標,按空格鍵可進行覈查,另外,各選項的的第一個字爲熱鍵,可單按選項的第一字符來做選擇,或按下1~9的數字鍵來選擇對應的選 項。用戶做了選擇後,該選項的"選項名稱"就是多重選擇的答案之一,默認會由標準錯誤輸出,輸出時,各選項默認會用雙引號含括。

若選項的數目超過列表的高度,則會出現滾動條,供用戶上下移動選項。

用例

範例 16-1-10:checklist1.sh

21 01. #! /bin/bash

22 02.

23 03. DIA='/usr/bin/dialog'

24 04.

25 05. TMP="/tmp/checklist.$$"

26 06. M1="請選擇您偏好的文件系統"

27 07. FSLIST="1.ext2第2版的擴展文件系統on 2.ext3
第3版的擴展文件系統on 3.ext4

28 第4版的擴展文件系統off"

29 08.

30 09. $DIA --checklist "$M1" 10 40 4 $FSLIST 2> $TMP

31 10.

32 11. FSTYPE=$(cat $TMP)

33 12. [ -z "$FSTYPE" ] && FSTYPE="ext3"

34 13.

35 14. rm -f "$TMP"

36 15.

37 16. echo "您選擇的是: $FSTYPE"

說明

行7,覈查項目列表中共有3個核查項目,前兩個的默認狀態是啓用(on)。

行9,對話框的高寬分別是10行和40個字符寬,覈查列表的高度是4行,選項列表的內容在FSLIST中。使用2> 把使用者的選擇由標準錯誤轉向存入TMP臨時文件中。

執行結果:

clip_image012

圖16-12 checklist1.sh的執行結果

如果加上選項--separate-output,那麼,用戶多重選擇的答案會分別輸出,不會用雙引號含括,其語法如下:

38 $DIA --separate-output --checklist "$M1" 10 40 4 $FSLIST

如果加上選項--single-quoted,則輸出多重選擇的答案時,則視需要加上單引號或不加任何引號,其語法如下:

39 $DIA --single-quoted --checklist "$M1" 10 40 4 $FSLIST

【責任編輯:雲霞 TEL:(010)68476606】

16.1 使用dialog撰寫文本接口程序(7

文件對話框(textbox

語法:dialog --textbox文本區 高 寬

用途 顯示文本區內容。

可使用箭頭鍵、PgUP、PgDn或使用vi的h、j、k、l按鍵法,來滾動顯示對話框中的內容。

1 dialog --textbox b2d.txt 10 40

信息對話框(infobox

語法:dialog --infobox信息內容 高 寬

用途 顯示信息後,馬上結束對話框。

用例

2 dialog --infobox"尚未完成準備工作喔" 10 40

調整時間對話框(timebox)

語法:dialog --timebox信息內容 高 寬 時 分 秒

"時 分 秒"可以省略。若不指定"時 分 秒",則顯示現在的時間。

用途 顯示時間,供用戶以箭頭鍵和【Tab】鍵做調整。

用例

3 dialog --timebox "調整時間" 4 30
 

倒數計時對話框(pause

語法:dialog --pause信息內容 高 寬 秒數

用途 顯示多少秒之後,結束對話框。

用例

4 dialog --pause "倒數計時" 10 40 10

這裏設定倒數計時10秒後,結束對話框。

選擇文本區對話框(fselect)

語法:dialog --fselect路徑文件名 高 寬

用途 顯示某一路徑下的文本區。

用例

5 dialog --fselect /var/www/index.php 10 40

按【Tab】鍵可在目錄和文件之間切換,按空格鍵可選擇文本區。

其他dialog的對話框,請參考man dialog的說明。

16.2 使用xdialog撰寫圖形接口程序(1

xdialog可向下和大部分的dialog語法兼容,因此,前一節中各種dialog的語法,在xdialog中仍可適用,只要把前一節各範例中的dialog文件名換成Xdialog即可。

以下僅舉msgbox、radiolist和inputbox爲例,其他對話框,則請比照dialog的用法模仿製,在此就不再重複贅述了。

xdialog除了支持大部分dialog的對話框之外,還支持許多比dialog功能更多樣化的對話框。在說明msgbox、radiolist和inputbox之後,再介紹這些圖形接口對話框。

顯示信息(msgbox

語法:Xdialog --msgbox信息內容 高度 寬度

用途 顯示信息

用例1

1 Xdialog --msgbox "這是一個測試" 10 40

執行結果:

clip_image013

圖16-13 顯示信息

用例2

2 Xdialog --backtitle "設置階段" --title "注意"
--msgbox "這是一個測試" 10 40

執行結果:

clip_image014

圖16-14 加上設定標題的顯示信息

多選一對話框(radiolist

語法:Xdialog --radiolist信息內容 高 寬 選項數目 選項列表

選項的格式是:"選項名稱 選項說明 默認是否啓用",其中on代表啓用,off代表不啓用。選項列表則是由各選項所組成的字符串。

用途 多選一。

用例

範例 16-2-1:radiolist2.sh

3 01. #! /bin/bash

4 02.

5 03. DIA='/usr/bin/Xdialog'

6 04.

7 05. TMP="/tmp/radiolist.$$"

8 06. M1="請選擇您偏好的文件系統"

9 07. NUMFS=3

10 08. FSLIST="ext2第2版的擴展文件系統off ext3
第3版的擴展文件系統on ext4

11 第4版的擴展文件系統off"

12 09.

13 10. $DIA --radiolist "$M1" 12 40 $NUMFS $FSLIST 2> $TMP

14 11.

15 12. FSTYPE=$(cat $TMP)

16 13. [ -z "$FSTYPE" ] && FSTYPE="ext3"

17 14.

18 15. rm -f "$TMP"

19 16.

20 17. echo "您選擇的是: $FSTYPE"

執行結果:

clip_image015

圖16-15 radiolist2.sh的執行結果

單行輸入對話框(inputbox

語法:dialog --inputbox信息內容 高 寬 初始值

初始值可以省略。若有設定初始值,則輸入欄中會出現該初始值。

用途 要求用戶輸入一列字符串。使用者可在輸入欄中,進行輸入或各種編輯的動作。

用例

範例 16-2-2:inputbox2.sh

21 01. #! /bin/bash

22 02.

23 03. DIA='/usr/bin/Xdialog'

24 04.

25 05. TMP="/tmp/inputbox.$$"

26 06.

27 07. DEFHNAME="sample.edu.tw"

28 08. M1="請設置主機名:"

29 09.

30 10. $DIA --inputbox "$M1" 10 40 $DEFHNAME 2> $TMP

31 11.

32 12. HNAME=$(cat $TMP)

33 13. [ -z "$HNAME" ] && HNAME=$DEFHNAME

34 14.

35 15. rm -f "$TMP"

36 16.

37 17. echo "您設置的主機名是: $HNAME"

16.2 使用xdialog撰寫圖形接口程序(2

執行結果:

clip_image016

圖16-16 inputbox2.sh的執行結果

Xdialog的inputbox,可再加上選項--password,此時,輸入欄中會以*代替鍵入的字符,且有個覈查按鈕可切換要不要顯示鍵入的字符。

範例 16-2-3:inputbox3.sh

1 01. #! /bin/bash

2 02.

3 03. DIA='/usr/bin/Xdialog'

4 04.

5 05. TMP="/tmp/inputbox.$$"

6 06.

7 07. DEFPWD="password999"

8 08. M1="請設置密碼:"

9 09.

10 10. $DIA --password --inputbox "$M1" 10 40 $DEFPWD 2> $TMP

11 11.

12 12. PWD=$(cat $TMP)

13 13. [ -z "$PWD" ] && PWD=$DEFPWD

14 14.

15 15. rm -f "$TMP"

16 16.

17 17. echo "您設置的密碼是: $PWD"

說明

行7,設定默認密碼變量DEFPWD。行10,加上--password選項,使輸入的字符改以*顯示。

執行結果:

clip_image017

圖16-17 勾選"Hide typing",可
切換輸入欄中的字符是否要顯示出來

雙行輸入對話框(2inputsbox)

語法:Xdialog--2inputsbox信息內容 高 寬 字段1的名稱 字段1初始值 字段2的名稱 字段2初始值

用途 顯示兩個輸入字段,取得兩種用戶輸入的數據。

用例

範例 16-2-4:inputbox4.sh

18 01. #! /bin/bash

19 02.

20 03. DIA='/usr/bin/Xdialog'

21 04.

22 05. TMP="/tmp/inputbox.$$"

23 06.

24 07. DEFACT="root"

25 08. DEFPWD="password999"

26 09. M1="請設定賬號密碼:"

27 10.

28 11. $DIA --password --2inputsbox "$M1" 16
40 "賬號" $DEFACT "密碼" $DEFPWD 2>

29 $TMP

30 12.

31 13. R=( $(cat $TMP | awk -F/ '{print $1,$2

32 ') )

33 14.

34 15. [ -z "${R[0]

35 " ] && R[0]=$DEFACT

36 16. [ -z "${R[1]

37 " ] && R[1]=$DEFPWD

38 17.

39 18. rm -f "$TMP"

40 19.

41 20. echo "你設定的賬號是: ${R[0]"

42 21. echo "你設定的密碼是: ${R[1]"

說明

行7,設定默認賬號變量DEFACT。

行8,設定默認密碼變量DEFPWD。

行11,使用雙列輸入對話框,並使用--password選項,讓第二個字段改以*顯示輸入字符。兩個字段的輸入值,轉向存入臨時文件TMP中,格式是:賬號/密碼。

行13,建立數組R。數組的組成方式是:R=(賬號 密碼),其中"賬號 密碼" 這個格式由$(cat $TMP | awk -F/ '{print $1,$2')產生,該式把$TMP的內容通過管線傳給awk,awk以/爲分隔字符,印出兩個字段,其結果就是"賬號 密碼",接着,在最外圍放上一對(),便形成一個數組,第一個數組元素是賬號,第二個數組元素是密碼。

行15,若第一個數組元素爲空,則令其值爲默認的賬號。

行16,若第二個數組元素爲空,則令其值爲默認的密碼。

行20~21,分別顯示用戶輸入的賬號和密碼。

執行結果:

clip_image018

圖16-18 雙列輸入對話框

【責任編輯:雲霞 TEL:(010)68476606】

16.2 使用xdialog撰寫圖形接口程序(3

三行輸入對話框(3inputsbox

語法:Xdialog --3inputsbox信息內容 高 寬 字段1的名稱 字段1初始值 字段2的名稱 字段2初始值 字段3的名稱 字段3初始值

若不想各字段出現初始值,只要在上述語法中,在字段初始值的位置放置空字符串 '' 即可,例如:

Xdialog --3inputsbox信息內容 高 寬 字段1的名稱 '' 字段2的名稱 '' 字段3的名稱 ''

用途 顯示3個輸入字段,取得3種用戶輸入的數據。

用途

1 Xdialog --3inputsbox "請輸入三個數字" 16 40
"數字1" 10 "數字2" 20 "數字3" 30

執行結果:

clip_image019

圖16-19 三列輸入對話框

3個輸入值的輸出格式範例:10/20/30。

下拉列表對話框(combobox)

語法:Xdialog --combobox信息內容 高 寬 選項1選項2 ...

用途 建立下拉列表,供使用者選擇。

用例

2 Xdialog --combobox "請選擇出發的站臺" 10 40
'北京' '上海' '廣州' '成都' '西安'

執行結果:

clip_image020

圖16-20 下拉列表對話框

用戶選擇的結果,即這5個選項之一,可運用前面幾個範例中使用轉向存入臨時盤的方法來取得。

若加上選項--editable,則用戶還可以自行編輯下拉列表中各個選項的內容,範例如下:

3 Xdialog --editable --combobox "請選擇出發的站臺
" 10 40 '北京' '上海' '廣州' '成都' '西安'

重設大小範圍的對話框(rangebox

語法:Xdialog --rangebox信息內容 高 寬 最小值 最大值 默認值

用途 建立一個可供重設大小範圍的對話框。

用例

4 Xdialog --rangebox "請選擇音量大小" 10 40 0 10 5

執行結果:

clip_image021

圖16-21 重設大小範圍的對話框

另外,Xdialog還支持2個和3個重設大小範圍滾動條的對話框。

【責任編輯:雲霞 TEL:(010)68476606】

16.2 使用xdialog撰寫圖形接口程序(4

兩個滾動條的對話框

語法:Xdialog --2rangesbox信息內容 高 寬 名稱1最小值 最大值 默認值1名稱2最小值 最大值 默認值2

用例

1 Xdialog --2rangesbox "請調整長寬" 16 40 '長' 10 20 15 '寬' 4 12 8

執行結果:

clip_image022

圖16-22 兩個滾動條的對話框

這裏調整其長爲13、寬爲9,其輸出格式是:13/9。

3個滾動條的對話框

語法:Xdialog --3rangesbox信息內容 高 寬 名稱1最小值 最大值 默認值1名稱2最小值 最大值 默認值2名稱3最小值 最大值 默認值3

用例

2 Xdialog --3rangesbox "請調整長寬高" 20 40 '長'
10 20 15 '寬' 4 12 8 '高' 2 10 6

其輸出格式是:15/8/6。

spinbox對話框

除了rangebox,Xdialog還支持一種叫spinbox的對話框,一樣也可對某些指定量重設大小範圍。

語法:

Xdialog --spinbox信息內容 高 寬 最小值 最大值 默認值 名稱

Xdialog --2spinsbox信息內容 高 寬 最小值 最大值 默認值1名稱1最小值 最大值 默認值2名稱2

Xdialog --3spinsbox信息內容 高 寬 最小值 最大值 默認值1名稱1最小值 最大值 默認值2名稱2最小值 最大值 默認值3名稱3

這裏僅舉一例,其他用法請自行類推:

3 Xdialog --spinbox "請調整高度" 10 40 10 50 20 '釐米'

執行結果:

clip_image023

圖16-23 spinbox對話框

編輯對話框(editbox)

語法:Xdialog --editbox文本區 高 寬

用途 建立一個可編輯文本區內容的對話框。

用例

4 Xdialog --editbox '/etc/hosts' 18 55

執行結果:

clip_image024

圖16-24 編輯對話框(editbox)

一樣可利用前面提到的幾個範例中的技巧,來取得編輯後的輸出內容。

Xdialog還支持幾個對話框,如tailbox、menubox、logbox、buildlist、treeview、dselect、 colorsel、fontsel、calendar等,限於篇幅的關係,就請讀者自行參考Xdialog的聯機幫助文件囉!網址如下:

5 http://xdialog.free.fr/doc/box.html

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