部件 | 描述 |
---|---|
calendar | 提供選擇日期的日歷 |
checklist | 顯示多個(gè)選項(xiàng)(其中每個(gè)選項(xiàng)都能打開(kāi)或關(guān)閉) |
form | 構(gòu)建一個(gè)帶有標(biāo)簽以及文本字段(可以填寫(xiě)內(nèi)容)的表單 |
fselect | 提供一個(gè)文件選擇窗口來(lái)瀏覽選擇文件 |
gauge | 顯示完成的百分比進(jìn)度條 |
infobox | 顯示一條消息,但不用等待回應(yīng) |
inputbox | 提供一個(gè)輸入文本用的文本表單 |
inputmenu | 提供一個(gè)可編輯的菜單 |
menu | 顯示可選擇的一系列選項(xiàng) |
msgbox | 顯示一條消息,并要求用戶選擇OK按鈕 |
pause | 顯示一個(gè)進(jìn)度條來(lái)顯示暫定期間的狀態(tài) |
passwordbox | 顯示一個(gè)文本框,但會(huì)隱藏輸入的文本 |
passwordform | 顯示一個(gè)帶標(biāo)簽的隱藏文本字段的表單 |
radiolist | 提供一組菜單選項(xiàng),但只能選擇其中一個(gè) |
tailbox | 用tail命令在滾動(dòng)窗口中顯示文件的內(nèi)容 |
tailboxbg | 跟tailbox一樣,但是在后臺(tái)模式中運(yùn)行 |
textbox | 在滾動(dòng)窗口中顯示文件的內(nèi)容 |
timebox | 提供一個(gè)選擇小時(shí)、分鐘和秒數(shù)的窗口 |
yesno | 提供一條帶有Yes和No按鈕的簡(jiǎn)單消息 |
如上表所見(jiàn),我們可以選擇很多不同的部件。只需要多花點(diǎn)功夫就可以讓腳本看起來(lái)更專(zhuān)業(yè)。
要在命令行上指定某個(gè)特定的部件,需要使用雙破折線格式:
dialog --widget parameters
其中widget是上表中某個(gè)特定的部件,parameters定義了部件窗口的大小以及部件需要的文本。
每個(gè)dialog部件都提供了兩種形式的輸出:
可以通過(guò)dialog命令的退出狀態(tài)碼來(lái)確定用戶選擇的按鈕。如果選擇了Yes或OK按鈕,命令會(huì)返回狀態(tài)碼0。如果選擇了Cancer或No按鈕,命令會(huì)返回狀態(tài)碼1。可用標(biāo)準(zhǔn)的$?變量來(lái)確定dialog部件具體選擇了哪個(gè)按鈕。
如果部件返回了數(shù)據(jù),dialog命令會(huì)將數(shù)據(jù)發(fā)送到STDERR。我們可以用標(biāo)準(zhǔn)的bash shell方法將其重定向到另一個(gè)文件或文件描述符中。
dialog --inputbox "Enter your age:" 10 20 2>age.txt
這條命令將文本框輸入的文本重定向到age.txt文本中。
msgbox部件
msgbox部件是對(duì)話框中最常見(jiàn)的類(lèi)型。它會(huì)在窗口中顯示一條簡(jiǎn)單的信息,直到用戶點(diǎn)擊OK后消失。
使用格式:
dialog --msgbox text height width
text參數(shù)是要在窗口顯示的字符串,height與width參數(shù)設(shè)定自動(dòng)換行的窗口大小。如果想要在窗口加一個(gè)標(biāo)題,可以使用--title參數(shù),后接作為標(biāo)題的文本。
例子:
dialog --title Testing --msgbox "This is a test" 10 20
輸入命令后,消息框會(huì)顯示在終端上。如果你的終端仿真器支持鼠標(biāo),可以單擊OK來(lái)關(guān)閉對(duì)話框,也可以按下回車(chē)鍵。
yesno部件
該部件在窗口底部生成兩個(gè)按鈕:一個(gè)是Yes,一個(gè)是No。用戶可以用鼠標(biāo)、制表符或者鍵盤(pán)方向鍵來(lái)切換按鈕。選擇按鈕則使用空格或者回車(chē)鍵。
下面是一個(gè)例子:
wsx@wsx:~$ dialog --title "Please answer" --yesno "Is this thing on?" 10 20 # 中間終端有輸出 wsx@wsx:~$ echo $? 0
dialog命令的退出狀態(tài)碼會(huì)根據(jù)用戶選擇的按鈕來(lái)設(shè)置。選擇No返回1,選擇Yes就是0。
inputbox部件
inputbox部件提供了一個(gè)簡(jiǎn)單的文本框區(qū)域來(lái)輸入文本字符串,dialog會(huì)將它傳到STDERR,我們需要重定向獲得輸入。inputbox提供了兩個(gè)按鈕:OK和Cancel。如果選擇了OK,命令退出狀態(tài)碼為0,否則為1。
wsx@wsx:~/tmp$ dialog --inputbox "Enter your age:" 10 20 2>age.txt wsx@wsx:~/tmp$ cat age.txt 24
如果你自己運(yùn)行過(guò)的話就會(huì)注意到該值后面沒(méi)有換行符,這讓我們能夠輕松將文本內(nèi)容重定向到腳本變量中,以獲得用戶輸入的值。
textbox部件
textbox部件是在窗口中顯示大量信息的極佳辦法。它會(huì)生成一個(gè)滾動(dòng)窗口來(lái)顯示由參數(shù)所指定的文件中的文本。
wsx@wsx:~/tmp$ dialog --textbox /etc/passwd 15 45
/etc/passwd文件內(nèi)容顯示在可滾動(dòng)的文本窗口中,可以用方向鍵來(lái)左右或上下滾動(dòng)顯示文件的內(nèi)容。窗口底部的行會(huì)顯示當(dāng)前查看文本處于文件中的哪個(gè)位置(百分比)。文本框只包含一個(gè)用來(lái)選擇退出部件的Exit按鈕。
menu部件
我們可以用這個(gè)部件來(lái)創(chuàng)建之前(上一篇筆記)中制作的文本菜單的窗口版本。只要為每個(gè)選項(xiàng)提供一個(gè)選擇標(biāo)號(hào)和文本就行。
wsx@wsx:~/tmp$ dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2>test.txt
第一個(gè)參數(shù)定義了菜單的標(biāo)題,之后的兩個(gè)參數(shù)定義了菜單窗口的高和寬,而第四個(gè)參數(shù)則定義了在窗口中一次顯示的菜單項(xiàng)總數(shù)。如果存在更多選擇,則有滾動(dòng)條。
菜單項(xiàng)必須使用菜單對(duì):第一個(gè)元素是用來(lái)選擇菜單項(xiàng)的標(biāo)號(hào)(必須唯一);第二個(gè)元素是菜單中使用的文本。
dialog命令會(huì)將選定(鼠標(biāo)點(diǎn)擊或回車(chē)鍵或選擇OK)的菜單項(xiàng)文本發(fā)送到STDERR。
fselect部件
該部件在處理文件名時(shí)非常方便。不用強(qiáng)制用戶鍵入文件名,我們就可以用fselect部件來(lái)瀏覽文件的位置并選擇文件。
使用格式:
wsx@wsx:~/tmp$ dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt
第一個(gè)參數(shù)是窗口使用的其實(shí)目錄位置。fselect部件窗口由左側(cè)的目錄列表、右側(cè)的文件列表和含有當(dāng)前選定的文件或目錄的簡(jiǎn)單文本框組成??梢允謩?dòng)在文本框鍵入文件名,或者用目錄和文件列表來(lái)選定(使用空格鍵選定)。
dialog選項(xiàng)
除了標(biāo)準(zhǔn)部件,dialog還有大量定制的選項(xiàng)。前面我們使用的title就是一個(gè)。
下面顯示了命令可用的選項(xiàng):
選項(xiàng) | 描述 |
---|---|
–add-widget | 繼續(xù)下一個(gè)對(duì)話框直到按下Esc或Cancel選項(xiàng) |
–aspect ratio | 直到窗口寬度和高度的寬高比 |
–backtitle title | 直到顯示在屏幕頂部背景上的圖標(biāo) |
–begin x y | 指定窗口左上角的起始位置 |
–cancel-label label | 指定Cancel按鈕的替代標(biāo)簽 |
–clear | 用默認(rèn)的對(duì)話背景色來(lái)清空屏幕內(nèi)容 |
–colors | 在對(duì)話文本中嵌入ANSI色彩編碼 |
–cr-wrap | 在對(duì)話文本中允許使用換行符并強(qiáng)制換行 |
–create-rc file | 將示例配置文件的內(nèi)容復(fù)制到指定的file文件中 |
–defaultno | 將yes/no對(duì)話框的默認(rèn)答案設(shè)為no |
–default-item string | 設(shè)定復(fù)選列表、表單或菜單對(duì)話中的默認(rèn)項(xiàng) |
–exit-label label | 指定Exit按鈕的替代標(biāo)簽 |
–extra-button | 在OK按鈕和Cancel按鈕之間顯示一個(gè)額外按鈕 |
–extra-label label | 指定額外按鈕的替換標(biāo)簽 |
–help | 顯示dialog命令的幫助信息 |
–help-button | 在OK按鈕和Cancel按鈕后顯示一個(gè)Help按鈕 |
–help-label label | 指定Help按鈕的替換標(biāo)簽 |
–help-status | 當(dāng)選定Help按鈕后,在幫助信息后寫(xiě)入多選列表、單選列表或表單信息 |
–ignore | 忽略dialog不能識(shí)別的選項(xiàng) |
–input-fd fd | 指定STDIN之外的另一個(gè)文件描述符 |
–insecure | 在passwd部件中鍵入內(nèi)容時(shí)顯示星號(hào) |
–item-help | 為多選列表、單選列表或菜單中的每個(gè)標(biāo)號(hào)在屏幕底部添加一個(gè)幫助欄 |
–keep-window | 不要清除屏幕上顯示過(guò)的部件 |
–max-input size | 指定輸入的最大字符串長(zhǎng)度。默認(rèn)為2048 |
–nocancel | 隱藏Cancel按鈕 |
–no-collapse | 不要將對(duì)話文本中的制表符轉(zhuǎn)換為空格 |
–no-kill | 將tailboxbg對(duì)話放到后臺(tái),并禁止該進(jìn)程的SIGHUP信號(hào) |
–no-label label | 為No按鈕指定替換標(biāo)簽 |
–no-shadow | 不要顯示對(duì)話窗口的陰影效果 |
–ok-label label | 指定OK按鈕的替換標(biāo)簽 |
–output-fd fd | 指定除STDERR之外的另一個(gè)輸出文件描述符 |
–print-maxsize | 將對(duì)話窗口的最大尺寸打印到輸出中 |
–print-size | 將每個(gè)對(duì)話窗口的大小打印到輸出中 |
–print-version | 將dialog的版本號(hào)打印到輸出中 |
–separate-output | 一次一行地輸出checklist部件的結(jié)果,不使用引號(hào) |
–separator string | 指定用于分隔部件輸出的字符串 |
–separate-widget string | 指定用于分隔部件輸出的字符串 |
–shadow | 在每個(gè)窗口右下角繪制陰影 |
–single-quoted | 需要時(shí)對(duì)多選列表的輸出采用單引號(hào) |
–sleep sec | 在處理完對(duì)話窗口后延遲指定的秒數(shù) |
–stderr | 將輸出發(fā)送到STDERR(默認(rèn)) |
–stdout | 將輸出發(fā)送到STDOUT |
–tab-correct | 將制表符轉(zhuǎn)換為空格 |
–tab-len n | 指定一個(gè)制表符占用的空格數(shù)(默認(rèn)為8) |
–timeout sec | 指定無(wú)用戶輸入時(shí),sec秒后退出并返回錯(cuò)誤代碼 |
–title title | 指定對(duì)話窗口的標(biāo)題 |
–trim | 從對(duì)話文本中刪除前導(dǎo)空格和換行符 |
–visit-tiems | 修改對(duì)話窗口制表符的停留位置,使其包括選項(xiàng)列表 |
–yes-label label | 為Yes按鈕指定替換標(biāo)簽 |
--backtitle選項(xiàng)是為腳本中的菜單創(chuàng)建公共標(biāo)題的簡(jiǎn)便辦法。上表提供的強(qiáng)大特性允許我們創(chuàng)建任何需要的窗口。
dialog命令支持運(yùn)行時(shí)配置。該命令會(huì)根據(jù)配置文件模板創(chuàng)建一份配置文件。dialog啟動(dòng)時(shí)會(huì)先去檢查是否設(shè)置了DIALOGRC環(huán)境變量,該變量會(huì)保存配置文件名信息。如果未設(shè)置該變量或未找到該文件,它會(huì)將$HOME/.dialogrc作為配置文件。如果這個(gè)文件還不存在的話就嘗試查找編譯時(shí)指定的GLOBALRC文件,也就是/etc/dialogrc。如果還不存在就用編譯時(shí)的默認(rèn)值。
在腳本中使用dialog命令
必須記住兩件事:
接下來(lái)是一個(gè)簡(jiǎn)單的實(shí)例,使用dialog部件生成我們之前(上一篇筆記)所創(chuàng)建的系統(tǒng)管理菜單。
wsx@wsx-laptop:~$ cat menu3 #!/bin/bash # using dialog to create a menu temp=$(mktemp -t test.XXXXXX) temp2=$(mktemp -t test2.XXXXXX) function diskspace { df -k > $temp dialog --textbox $temp 20 60 } function whoseon { who > $temp dialog --textbox $temp 20 50 } function menusage { cat /proc/meminfo > $temp dialog --textbox $temp 20 50 } while [ 1 ] do dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2> $temp2 if [ $? -eq 1 ] then break fi selection=$(cat $temp2) case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) dialog --msgbox "Sorry, invalid selection" 10 30 esac done rm -f $temp 2> /dev/null rm -f $temp 2> /dev/null
使用while循環(huán)加一個(gè)真值常量創(chuàng)建了一個(gè)無(wú)限循環(huán)來(lái)顯示菜單對(duì)話。當(dāng)執(zhí)行完每個(gè)函數(shù)后,腳本會(huì)返回繼續(xù)顯示菜單。
腳本使用了mktemp命令創(chuàng)建兩個(gè)臨時(shí)文件來(lái)保存dialog命令的數(shù)據(jù)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
標(biāo)簽:昌都 臨沂 海北 廣東 撫州 連云港 烏蘭察布 贛州
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《利用shell創(chuàng)建文本菜單與窗口部件的方法》,本文關(guān)鍵詞 利用,shell,創(chuàng)建,文本,菜單,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。