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