Ubuntu shell編程在Linux控制臺(tái)運(yùn)行
Ubuntu shell還是比較常用的,于是我研究了一下Ubuntu shell,在這里拿出來和大家分享一下,希望對(duì)大家有用。在我們結(jié)束Ubuntu shell腳本討論之前,有一個(gè)雖然不是Ubuntu shell的一部分但卻有更多的特性,尤其對(duì)于Ubuntu shell編程來說使用也非常普遍,因此我們將在此對(duì)它做一番了解。
如果我們知道我們的腳本將只在Linux控制臺(tái)運(yùn)行,有一種簡(jiǎn)潔的方法可以用來改善我們的腳本特色,它就是dialog,一個(gè)實(shí)用程序命令。該命令雖然使用文本模式圖形和顏色,但看起來依舊有著令人愉悅的圖形色彩。
注意:在一些發(fā)行版中,dialog不是默認(rèn)安裝的。比如在Ubuntu下你可能不得不添加公共軟件倉庫地址以獲得一個(gè)對(duì)應(yīng)的軟件版本。另外,在一些發(fā)行版中,我們可能會(huì)發(fā)現(xiàn)在其中已經(jīng)安裝了一個(gè)叫g(shù)dialog的程序,看起來十分類似,不過它是基于GNOME用戶界面來顯示它的會(huì)話,只是返回來的是一個(gè)真正的圖形界面。
整個(gè)dialog的思想都很簡(jiǎn)單——只是一個(gè)有著種類繁多的參數(shù)和選項(xiàng)的單一程序,而且這些參數(shù)和選項(xiàng)允許你用來顯示不同種類的圖形方框,所顯示的范圍也只是有著簡(jiǎn)單的Yes/No的輸入方框以及甚至還擁有菜單選擇。這個(gè)工具一般在用戶進(jìn)行輸入操作之后返回,并且返回的結(jié)果可以由返回的狀態(tài)或者是通過取回標(biāo)準(zhǔn)錯(cuò)誤流輸入的文本得到。
在我們深入了解之前,先讓我們看一個(gè)簡(jiǎn)單的dialog運(yùn)用。我們直接從命令行通過使用dialog創(chuàng)建一個(gè)簡(jiǎn)單的消息框:dialog --msgbox "Hello World" 9 18
之后在屏幕上將顯示一個(gè)帶有OK對(duì)話框的圖形消息框。既然我們已經(jīng)知道了dialog的操作是如此簡(jiǎn)單,之后讓我們盡可能地了解更多與之相關(guān)的內(nèi)容。下表為我們描述了我們可以創(chuàng)建的dialog的主要類型:
- Type Option Used to Create Type Meaning
- Check boxes --checklist 允許我們顯示列表項(xiàng),且每一個(gè)都能被單獨(dú)選擇
- Info boxes --infobox 不用清屏就能直接返回的簡(jiǎn)單對(duì)話框
- Input boxes --inputbox 允許用戶以文本方式輸入
- Menu boxes --menu 允許用戶從一列中選擇單一的一項(xiàng)
- Message boxes --msgbox 向用戶顯示一條帶有OK按鈕的信息
- Radio selection boxes --radiolist 允許用戶從一列中選擇一個(gè)選項(xiàng)
- Text boxes --textbox 允許我們?cè)谝粋€(gè)有滾動(dòng)軸的框中顯示文件內(nèi)容
- Yes/No boxes --yesno 允許你問一個(gè)問題,之后用戶可以選擇yes或no
一些額外的dialog對(duì)話框同樣也是很有用的(比如計(jì)量器和密碼輸入對(duì)話框)。如果你想要了解更多不太常用的dialog類型,可以查閱相關(guān)的手冊(cè)指南。為了得到允許文本輸入或選擇的對(duì)話框的任何類型的輸出.
我們不得不捕獲標(biāo)準(zhǔn)錯(cuò)誤流,通常我們都直接將它送到一個(gè)臨時(shí)文件中,之后再對(duì)它進(jìn)行處理。而為了得到y(tǒng)es/no類型問題的結(jié)果,我們只需看退出代碼,通常設(shè)計(jì)良好的程序都將返回0代表成功,而返回1則代表失敗。
所有的dialog類型都有許多附加參數(shù)來用于控制,比如dialog所呈現(xiàn)的大小以及形狀。我們?cè)谙卤砹谐隽嗣恳环N類型所需要的不同參數(shù),之后我們將在命令行中示范操作他們中的一部分。最后,你將會(huì)看到在一個(gè)簡(jiǎn)單的包含幾個(gè)dialog的程序。
- Dialog Type Parameters
- --checklist text height width list-height [tag text status]...
- --infobox text height width
- --inputbox text height width [initial string]
- --menu text height width menu-height [tag item]...
- --msgbox text height width
- --radiolist text height width list-height [tag text status]...
- --textbox filename height width
- --yesno text height width
此外,所有的diglog類型都可以攜帶幾個(gè)選項(xiàng),我們不會(huì)在此將它們一一列出,除了需要注意這兩個(gè):
--title允許你為對(duì)話框指定一個(gè)標(biāo)題
--clear使用它就是為了清屏
若想了解所有的選項(xiàng),請(qǐng)查閱相關(guān)的手冊(cè)指南。
下面讓我來看一下一個(gè)有點(diǎn)復(fù)雜的例子。一旦你理解了這個(gè)例子,其他的dialog實(shí)例將變得容易。在這個(gè)例子中,你創(chuàng)建了一個(gè)帶有標(biāo)題“Check me”以及指令“Pick Numbers”的清單類型對(duì)話框。這個(gè)對(duì)話框高15個(gè)字符,寬25個(gè)字符,并且每個(gè)選項(xiàng)都要占領(lǐng)3個(gè)字符的高度。最后,你至少在顯示這些列出的選項(xiàng)時(shí),需要沿著一個(gè)默認(rèn)的on/off選擇。
diag --title "Check me" --checklist "Pick Numbers" 15 25 3 1 "one" "off" 2 "two" "on" 3 "three" "off"
原理:在這個(gè)示例中,參數(shù)--checklist指定了你將創(chuàng)建一個(gè)清單類型對(duì)話框。之后你使用--title選項(xiàng)來設(shè)置標(biāo)題“Check me”,而接下來的參數(shù)則提示“Pick Numbers”的信息。然后你開始設(shè)置對(duì)話框的大小,15行高25字符寬,并有3行高的高度被用于菜單的顯示。這雖然不是一個(gè)完美的尺寸,但足夠你看到所有的東西都被呈現(xiàn)出來。
選項(xiàng)的使用看起來有點(diǎn)錯(cuò)綜復(fù)雜,但你需要全部記住的只是每個(gè)菜單項(xiàng)目都只有三個(gè)數(shù)值:標(biāo)號(hào)、文本以及狀態(tài)。第一個(gè)項(xiàng)目為1,顯示為“one”并且設(shè)置為“off”。之后的菜單項(xiàng)目2顯示為“two”,設(shè)置為“on”,即被此項(xiàng)被選中了。最后菜單項(xiàng)目3顯示為“three”,設(shè)置為“off”。
很容易,對(duì)不對(duì)?我們只需嘗試將他們?cè)诿钚兄羞\(yùn)行就可以輕易地看出它們是怎樣被使用的。為了將這些對(duì)話框放入一個(gè)程序中,我們需要能夠訪問用戶所輸入的結(jié)果,這是非常容易的。只需為文本輸入將標(biāo)準(zhǔn)錯(cuò)誤流重定向,或者檢查系統(tǒng)環(huán)境變量$?,這樣你就可以再次調(diào)用先前命令的退出狀態(tài)。
下面我們看一個(gè)使用dialog的更復(fù)雜一些的例子。我們先編寫一個(gè)簡(jiǎn)單的程序questions,它用來接受用戶響應(yīng)的記錄:
1.開始先顯示一個(gè)簡(jiǎn)單的對(duì)話框以告訴用戶發(fā)生了什么,你不需要得到相關(guān)的結(jié)果或獲取任何用戶輸入,因此我們可以這樣簡(jiǎn)單地編寫:
- #!/bin/sh
- # Ask some questions and collect the answer
- dialog --title "Questionnaire" --msgbox "Welcome to my simple survey" 9 18
2.通過一個(gè)簡(jiǎn)單的yes/no對(duì)話框詢問用戶是否繼續(xù)進(jìn)行。通過使用環(huán)境變量$?來檢查用戶所選擇的到底是yes(返回代碼0)還是no。如果他不想繼續(xù)進(jìn)行,我們就會(huì)在退出前使用一個(gè)簡(jiǎn)單的不需要用戶有輸入的信息對(duì)話框:
- diag --title "Confirm" --yesno "Are you willing to take part?" 9 18
- if [ $? != 0 ]; then
- dialog --infobox "Thank you anyway" 5 20
- sleep 2
- dialog --clear
- exit 0
- fi
3.通過一個(gè)輸入框詢問用戶的名字。重定向標(biāo)準(zhǔn)錯(cuò)誤流2到一個(gè)臨時(shí)文件_1.txt中,之后通過變量Q_NAME來進(jìn)行處理:
- dialog --title "Questionnaire" --inputbox "Please enter your name" 9 30 2>_1.txt
- Q_NAME=$(cat _1.txt)
4.在此處你將設(shè)置菜單項(xiàng)目為四個(gè)不同的選項(xiàng),之后你再次重定向標(biāo)準(zhǔn)錯(cuò)誤流并將它置入一個(gè)變量中:
- dialog --menu "$Q_NAME, what music do you like best?" 15 30 4 1 "Classical" 2 "Jazz" 3 "Country" 4 "Other" 2>_1.txt
- Q_MUSIC=(cat _1.txt)
5.根據(jù)所獲得的變量Q_MUSIC得到存儲(chǔ)在臨時(shí)文件_1.txt中的用戶所選擇的數(shù)字,你可以這樣來設(shè)置結(jié)果:
- if [ "$Q_MUSIC" = "1" ]; then
- dialog --title "Likes Classical" --msgbox "Good choice!" 12 25
- else
- dialog --title "Doesn't like Classical" --msgbox "What a shame!" 12 25
- fi
6.最后,清除最終的對(duì)話框,之后退出程序:
- sleep 2
- dialog --clear
- exit 0
OK,現(xiàn)在我們可以通過Ubuntu shell編程只使用Ubuntu shell腳本來顯示一個(gè)簡(jiǎn)單GUI程序了。
注:如果你將運(yùn)行于一個(gè)基于GNOME的GUI且只在其中使用終端會(huì)話的話,你可以使用gdialog命令來替代dialog。這兩個(gè)命令擁有一樣的參數(shù),所以你完全可以使用gdialog替代dialog來執(zhí)行相同的代碼。
【編輯推薦】