《控制腳本流程》_第1頁
《控制腳本流程》_第2頁
《控制腳本流程》_第3頁
《控制腳本流程》_第4頁
《控制腳本流程》_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

控制腳本流程整理ppt引言如何測試表達(dá)式的邏輯值?如何設(shè)計分支結(jié)構(gòu)?如何設(shè)計循環(huán)結(jié)構(gòu)?【問題的提出】Geecy軟件開發(fā)公司的開發(fā)人員Tom所開發(fā)的通訊錄管理腳本phone.sh的改進(jìn)版本如下:tom@geecy:~$catphone.sh↙#!/bin/bashreadCount<count_file.txtecho"[${Count}]:"echo-n"Enteryourname:"readNameecho-n"Enteryourphonenumber:"readPhoneecho"$Count:$Name:$Phone">>file.txtCount=$((Count+1))echo$Count>count_file.txt./phone.sh【問題的提出】(續(xù))該版本比舊版本已經(jīng)有了很大的改進(jìn),能夠滿足一般的使用。但是根據(jù)Tom的開發(fā)經(jīng)驗,該版本至少存在四大缺陷: (1)腳本運(yùn)行的穩(wěn)定性不高,因為該腳本嚴(yán)重依賴于輔助文件count_file.txt,一旦該文件被以外破壞,該腳本將不能正常工作; (2)運(yùn)行性能不高,因為該腳本在運(yùn)行過程中需要頻繁讀寫三個文件,而從該腳本的功能來看,運(yùn)行過程中需要頻繁讀寫的文件應(yīng)該只有數(shù)據(jù)文件“file.txt”; (3)功能單一,因為目前只有增加功能,還缺乏基本的搜索功能; (4)用戶界面不夠友好,應(yīng)該使用菜單式的用戶界面。 因此Tom需要繼續(xù)改進(jìn)該腳本?!締栴}分析】如果要提高穩(wěn)定性,就要想辦法避免使用輔助文件count_file.txt。最大值就在數(shù)據(jù)文件file.txt的最后一行的第一個數(shù)據(jù)域。只需要想辦法在增加一行新數(shù)據(jù)之前把該值讀出來,然后增加一,就可以構(gòu)造出下一個編號。命令tail,能夠從一個文本文件的最后一行起,連續(xù)抽取若干行數(shù)據(jù)顯示到屏幕?!締栴}分析】(續(xù))如果上述的穩(wěn)定性問題解決了,那么只需要避免使用腳本的遞歸調(diào)用就可以實現(xiàn)整個運(yùn)行過程只需要頻繁讀寫一個文件,即數(shù)據(jù)文件file.txt。只要找到能夠重復(fù)運(yùn)行某一部分腳本的替代方法,那么腳本的遞歸調(diào)用這種方法就可以“退役”了?!締栴}分析】(續(xù))對于搜索功能的實現(xiàn),可以使用grep命令來完成?!締栴}分析】(續(xù))菜單式的用戶界面的實現(xiàn)原理,就是首先打印若干個菜單項的內(nèi)容到屏幕上,等待用戶選擇其中一個功能,腳本程序根據(jù)用戶的鍵盤輸入來判斷用戶的選擇,從而進(jìn)行相應(yīng)功能的操作。然后重復(fù)。測試表達(dá)式test命令能夠?qū)Ρ磉_(dá)式進(jìn)行測試并求出True或False的邏輯值。例如: test$Name="Linus"test命令的語法要求被測試的表達(dá)式中的比較運(yùn)算符(例如這里的“=”)的左右兩邊必須有空格。測試表達(dá)式(續(xù))test命令可以一次測試多個表達(dá)式。這些表達(dá)式之間需要使用選項“-a”或“-o”連接。例如:

test$Name="Linus"-a$Country="China"為了有更好的可讀性,用戶可以使用方括號“[]”來代替test命令。例如:

[$Name="Linus"]設(shè)計分支結(jié)構(gòu)分支結(jié)構(gòu)提供給用戶一種流程控制的能力,能夠讓用戶根據(jù)某些條件作出判斷,然后有所選擇地執(zhí)行某些語句。使用if語句和case語句都可以實現(xiàn)分支結(jié)構(gòu)。設(shè)計分支結(jié)構(gòu)(續(xù))if語句的基本格式為: if<Condition> then <Commands1> else <Commands2> fi設(shè)計分支結(jié)構(gòu)(續(xù))#!/bin/bashecho-n"Doyouknowtheanswer?(y/n)"readResultif[$Result="y"]then echo"Good!" echo"Congratulations!"else echo"Bad!" echo"Workhard!"fiecho"Finished!"設(shè)計分支結(jié)構(gòu)(續(xù))case語句的基本格式為: case<Variable>in Pattern1) <Commands1> ;; Pattern2) <Commands2> ;; ...... *) <Commands> ;; esac設(shè)計分支結(jié)構(gòu)(續(xù))#!/bin/bashecho-n"Enteraword(dozenorscore):"readStrcase$Strindozen)echo"12";;score)echo"20";;*)echo"Itisneitheradozennorascore.";;esac測試字符串對字符串的測試,除了測試是否相等,還有其他的一些常用的測試。選項作用string如果string的長度不為零,則值為True,否則為False-zstring如果string的長度為零,則值為True,否則為FalseString1=String2如果string1與string2相等,則值為True,否則為FalseString1!=String2如果string1與string2不相等,則值為True,否則為False測試算術(shù)式Shell的變量是字符串類型,如果要把變量的內(nèi)容作為數(shù)值進(jìn)行比較,則需要使用算術(shù)測試選項。選項作用-eq等于(Equal)-ne不等于(NotEqual)-gt大于(GreaterThen)-ge大于(GreaterThen)或等于(Equal)-lt小于(LessThen)-le小于(LessThen)或等于(Equal)測試文件選項作

用-eFile如果文件File存在(Exist),則為True-sFile如果文件File存在且文件大小(Size)大于零,則為True-fFile如果文件File存在且是普通文件(File),則為True-dFile如果文件File存在且是目錄(Directory),則為True-bFile如果文件File存在且是塊(Block)特殊文件,則為True-cFile如果文件File存在且是字符(Character)特殊文件,則為True-LFile如果文件File存在且是符號鏈接(Link)文件,則為True測試文件(續(xù))選

項作

用-rFile如果文件File存在且是可讀的(Readable),則為True-wFile如果文件File存在且是可寫的(Writable),則為True-xFile如果文件File存在且是可執(zhí)行的(Executable),則為True-OFile如果文件File存在且屬于當(dāng)前用戶(Owner),則為True-GFile如果文件File存在且屬于當(dāng)前用戶組(Group),則為TrueFile1–ntFile2如果文件File1新于(NewerThen)File2,則為TrueFile1–otFile2如果文件File1舊于(OlderThen)File2,則為True設(shè)計循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)提供了重復(fù)執(zhí)行一段腳本的能力。腳本程序可以使用兩種風(fēng)格的循環(huán)語句來實現(xiàn)循環(huán)結(jié)構(gòu):while循環(huán)和for循環(huán)。設(shè)計循環(huán)結(jié)構(gòu)(續(xù))使用while語句的格式是:

while<Condition> do <Commands> done設(shè)計循環(huán)結(jié)構(gòu)(續(xù))#!/bin/bashCount=1while[$Count-le10]doecho$CountCount=$((Count+1))done設(shè)計循環(huán)結(jié)構(gòu)(續(xù))for語句實現(xiàn)循環(huán)結(jié)構(gòu)的一種格式是:

for((Expression1;Expression2;Expression3))do <Commands>done設(shè)計循環(huán)結(jié)構(gòu)(續(xù))#!/bin/bashfor((Count=1;Count<=10;Count=Count+1))doecho$Countdone設(shè)計循環(huán)結(jié)構(gòu)(續(xù))for語句實現(xiàn)循環(huán)結(jié)構(gòu)的另一種格式是:

for<Variable>in<List> do <Commands> done設(shè)計循環(huán)結(jié)構(gòu)(續(xù))#!/bin/bashforFileNamein`ls~`doif[-f~/$FileName]thenecho"Thecontentsof~/${FileName}is:"cat~/$FileNamefiDone【解決方案】#!/bin/bashFile="file.txt"if[-s$File]thenCount=`tail-n1file.txt|cut-d":"-f1`Count=$((Count+1))elseCount="1001"fi【解決方案】(續(xù))whiletruedoclearecho"[0].Exit"echo"[1].Addphonenumber"echo"[2].Searchnameorphonenumber"echo-n"Yourchoice(0,1or2):"readKeycase$Keyin0)exit;;【解決方案】(續(xù))1)clearecho"[${Count}]:"echo-n"Enteryourname:"readNameecho-n"Enteryourphonenumber:"readPhoneecho"$Count:$Name:$Phone">>file.txtCount=$((Count+1));;【解決方案】(續(xù))2)clearecho-n"Inputakeyword:"readWordcleargrep$Word$Fileecho"Pressentertocontinue..."readEnter;;esacDone練習(xí)1、編寫一個Shell腳本,從鍵盤讀入5個整數(shù)。然后顯示最大數(shù)、最小數(shù)以及平均值。2、編寫一個Shell腳本,顯示Fibonacci數(shù)列的前20項。例如: 0,1,1,2,3,5,8,13,21...練習(xí)(續(xù))3、編寫一個Shell腳本,從鍵盤上接收兩個文件名,如果兩個文件都存在則交換兩個文件的內(nèi)容,否則應(yīng)給出出錯信息。4、編寫一個shell腳本,產(chǎn)生并輸出如下的序列:

1,2,3,2,3,4,3,4,5,4,5,6…98,99,100練習(xí)(續(xù))5、Cell寬帶數(shù)據(jù)公司的客戶服務(wù)中心對值班員工的工作質(zhì)量進(jìn)行跟蹤評價,評價標(biāo)準(zhǔn)是客戶對值班員工的“滿意”投票數(shù)量與總投票數(shù)量的比值。如下表所示: Tenny需要編寫一個shell腳本,讀入“滿意”投票數(shù)量和總投票數(shù)量,然后計算并輸出相應(yīng)的評定等級。比

值(%)等

級Lessthen70AverageBetween70and95GoodGreaterthen95Excellent練習(xí)(續(xù))6、Cell寬帶數(shù)據(jù)公司向客戶提供一種菜單式的查詢服務(wù),如下表所示: Tenny需要編寫一個shell腳本,顯示服務(wù)菜單。當(dāng)客戶選擇某一項服務(wù)后輸出相應(yīng)的服務(wù)內(nèi)容。序

號服

務(wù)

稱服

務(wù)

內(nèi)

容1查詢費(fèi)用(Billquer

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論