lec4 2 shell腳本程序設(shè)計_第1頁
lec4 2 shell腳本程序設(shè)計_第2頁
lec4 2 shell腳本程序設(shè)計_第3頁
lec4 2 shell腳本程序設(shè)計_第4頁
lec4 2 shell腳本程序設(shè)計_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Shell編程部門日期

版本管理修改記錄

審核記錄版本號.作者描述修改日期V01謝妍Created2014-06-07V02KITTModified2013-8-27V03xushanModified2015-1-3版本號.職務(wù)簽名修改日期

目錄ShellShell腳本Shell英文單詞Shell可直譯為“貝殼”。“貝殼”是動物作為外在保護的一種工具。Linux中的Shell可以理解為Linux內(nèi)核的一個外層保護工具,并負責完成用戶與內(nèi)核之間的交互。Shell是一個命令行解釋器,將用戶命令解析為操作系統(tǒng)所能理解的指令,實現(xiàn)用戶與操作系統(tǒng)的交互。Shell簡單地講,就是命令解析器,將用戶輸入的指令轉(zhuǎn)換為相應(yīng)的機器能夠運行的程序,

Shell既是一種命令語言,又是一種程序設(shè)計語言。作為命令語言,它交互式地解釋和執(zhí)行用戶輸入的命令;作為程序設(shè)計語言,它定義了各種變量和參數(shù),并提供了許多在高級語言中才具有的控制結(jié)構(gòu),包括循環(huán)和分支。用戶在命令行提示符下鍵入命令,Shell接受程序執(zhí)行請求,分析命令和參數(shù)。(交互過程)Shell將用戶的命令轉(zhuǎn)化成內(nèi)核所能夠理解的指令。內(nèi)核控制操作系統(tǒng)和相關(guān)硬件設(shè)備。最后,通過Shell界面將結(jié)果返回給用戶。ShellBourneshell(sh)Kornshell(ksh)BourneAgainshell(bash)Cshell(包括cshandtcsh)TENEX/TOPSCshell(tcsh)Shell常見種類bash是Linux標準默認的shell,bash由BrianFox和ChetRamey共同完成,是BourneAgainShell的縮寫,內(nèi)部命令一共有40個。Linux使用它作為默認的shell是因為它有諸如以下的特色:可以使用類似DOS下面的doskey的功能,用方向鍵查閱和快速輸入并修改命令。自動通過查找匹配的方式給出以某字符串開頭的命令。包含了自身的幫助功能,你只要在提示符下面鍵入help就可以得到相關(guān)的幫助。bashsh由SteveBourne開發(fā),是BourneShell的縮寫,sh是Unix標準默認的shell。shashshell是由KennethAlmquist編寫的,Linux中占用系統(tǒng)資源最少的一個小shell,它只包含24個內(nèi)部命令,因而使用起來很不方便。ashcsh是Linux比較大的內(nèi)核,它由以WilliamJoy為代表的共計47位作者編成,共有52個內(nèi)部命令。該shell其實是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。cshksh是Kornshell的縮寫,由EricGisin編寫,共有42條內(nèi)部命令。該shell最大的優(yōu)點是幾乎和商業(yè)發(fā)行版的ksh完全兼容,這樣就可以在不用花錢購買商業(yè)版本的情況下嘗試商業(yè)版本的性能了。ksh注意:bash是BourneAgainShell的縮寫,是linux標準的默認shell,它基于Bourneshell,吸收了Cshell和Kornshell的一些特性。bash完全兼容sh,也就是說,用sh寫的腳本可以不加修改的在bash中執(zhí)行。Bash與shShell腳本是一個包含一系列命令序列的文本文件。當運行這個腳本文件時,文件中包含的命令序列將得到執(zhí)行。(展示、運行sh01.sh)Shell腳本Shell腳本語言與編譯型語言的差異大體上,可以將程序設(shè)計語言可以分為兩類:編譯型語言C/C++解釋型語言Shell腳本語言是解釋型語言Shell腳本的本質(zhì):Shell命令的有序集合。編譯型語言很多傳統(tǒng)的程序設(shè)計語言,例如Fortran、Ada、Pascal、C、C++和Java,都是編譯型語言。這類語言需要預(yù)先將我們寫好的源代碼(sourcecode)轉(zhuǎn)換成目標代碼(objectcode),這個過程被稱作“編譯”。運行程序時,直接讀取目標代碼(objectcode)。由于編譯后的目標代碼(objectcode)非常接近計算機底層,因此執(zhí)行效率很高,這是編譯型語言的優(yōu)點。但是,由于編譯型語言多半運作于底層,所處理的是字節(jié)、整數(shù)、浮點數(shù)或是其他機器層級的對象,往往實現(xiàn)一個簡單的功能需要大量復(fù)雜的代碼。例如,在C++里,就很難進行“將一個目錄里所有的文件復(fù)制到另一個目錄中”之類的簡單操作。解釋型語言解釋型語言也被稱作“腳本語言”。執(zhí)行這類程序時,解釋器(interpreter)需要讀取我們編寫的源代碼(sourcecode),并將其轉(zhuǎn)換成目標代碼(objectcode),再由計算機運行。因為每次執(zhí)行程序都多了編譯的過程,因此效率有所下降。使用腳本編程語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象;缺點是它們的效率通常不如編譯型語言。不過權(quán)衡之下,通常使用腳本編程還是值得的:花一個小時寫成的簡單腳本,同樣的功能用C或C++來編寫實現(xiàn),可能需要兩天,而且一般來說,腳本執(zhí)行的速度已經(jīng)夠快了,快到足以讓人忽略它性能上的問題。腳本編程語言的例子有awk、Perl、Python、Ruby與Shell。什么時候用shell因為Shell似乎是各UNIX系統(tǒng)之間通用的功能,并且經(jīng)過了POSIX的標準化。因此,Shell腳本只要“用心寫”一次,即可應(yīng)用到很多系統(tǒng)上。因此,之所以要使用Shell腳本是基于:簡單性:Shell是一個高級語言;通過它,你可以簡潔地表

達復(fù)雜的操作??梢浦残裕菏褂肞OSIX所定義的功能,可以做到腳本無須

修改就可在不同的系統(tǒng)上執(zhí)行。開發(fā)容易:可以在短時間內(nèi)完成一個功能強大又妤用的腳

本。什么時候用shell但是,考慮到Shell腳本的命令限制和效率問題,下列情況一般不使用Shell:資源密集型的任務(wù),尤其在需要考慮效率時(比如,排序,hash等等)需要處理大任務(wù)的數(shù)學(xué)操作,尤其是浮點運算,精確運算,或者復(fù)雜

的算術(shù)運算(這種情況一般使用C++或FORTRAN來處理)。有跨平臺(操作系統(tǒng))移植需求(一般使用C或Java)。復(fù)雜的應(yīng)用,在必須使用結(jié)構(gòu)化編程的時候(需要變量的類型檢查,

函數(shù)原型,等等)。對于影響系統(tǒng)全局性的關(guān)鍵任務(wù)應(yīng)用。對于安全有很高要求的任務(wù),比如你需要一個健壯的系統(tǒng)來防止入侵

、破解、惡意破壞等等。項目由連串的依賴的各個部分組成。需要大規(guī)模的文件操作。什么時候用shell需要多維數(shù)組的支持。需要數(shù)據(jù)結(jié)構(gòu)的支持,比如鏈表或數(shù)等數(shù)據(jù)結(jié)構(gòu)。需要產(chǎn)生或操作圖形化界面GUI。需要直接操作系統(tǒng)硬件。需要I/O或socket接口。需要使用庫或者遺留下來的老代碼的接口。私人的、閉源的應(yīng)用(shell腳本把代碼就放在文本文件中,全世界都

能看到)。如果你的應(yīng)用符合上邊的任意一條,那么就考慮一下更強大的語言吧——或許是Perl、Tcl、Python、Ruby——或者是更高層次的編譯語言比如C/C++,或者是Java。即使如此,你會發(fā)現(xiàn),使用shell來原型開發(fā)你的應(yīng)用,在開發(fā)步驟中也是非常有用的。Shell語法 Shell腳本的第一行必須是如下格式:

#!/bin/sh

符號#!用來指定該腳本文件的解析程序。在上面例子中使用/bin/sh來解析該腳本。當編輯好腳本后,如果要執(zhí)行該腳本,還必須使其具有可執(zhí)行屬性。

chmod+x./filenameShell注釋在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結(jié)束。如果使用了注釋,即使相當長的時間內(nèi)沒有使用該腳本,也能在很短的時間內(nèi)明白該腳本的作用及工作原理Shell變量

在shell編程中,所有的變量都由字符串組成,并且不需要預(yù)先對變量進行聲明,例:sh1.sh(演示)。#!/bin/sh#setvariableatmp="helloworld"#printtmpecho“tmpis:"echo$aShell注釋有時候變量名很容易與其他文字混淆。例:sh2.sh(演示):num=2echo"thisisthe$numnd“

思考:輸出?Why?Shell默認變量num=2echo"thisisthe$numnd"

這并不會打印出“thisisthe2nd”,而僅僅打印“thisisthe“,因為shell會去搜索變量numnd的值,但是這個變量時沒有值的??梢允褂没ɡㄌ杹砀嬖Vshell我們要打印的是num變量:num=2echo"thisisthe${num}nd"這將打印:thisisthe2ndShell特殊變量變量名只能包含數(shù)字、字母和下劃線,某些包含其他字符的變量有特殊含義,這樣的變量被稱為特殊變量。例如,$表示當前Shell進程的ID,即pid,看下面的代碼:$echo$$運行結(jié)果29949Shell特殊變量$#:傳入腳本的命令行參數(shù)個數(shù)$*:所有命令行參數(shù)值,在各個參數(shù)值之間留有空格$0:命令本身(shell文件名)$1:第一個命令行參數(shù)$2:第二個命令行參數(shù)Shell變量sh3.sh(演示):#!/bin/shecho"numberofvars:"$#echo"valuesofvars:"$*echo"valueofvar1:"$1echo"valueofvar2:"$2echo"valueofvar3:"$3echo"valueofvar4:"$4運行./s3.sh1234輸出結(jié)果:?Shell局部變量在變量首次被賦值時加上local關(guān)鍵字可以聲明一個局部變量,例:sh4.sh(演示):#!/bin/shvar="var1"echo$varfunctionfunc1(){localvar="var2"echo$var}func1echo$var運行:./sh4.sh輸出:?Shell變量1、變量賦值時,“=”左右兩邊都不能有空格2、變量名和等號之間不能有空格3、BASH中的語句結(jié)尾不需要分號變量名的命名必須遵循如下規(guī)則:首個字符必須為字母(a-z,A-Z)。中間不能有空格,可以使用下劃線(_)。不能使用標點符號。不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)If語句if[expression]then #codeblockfiif[expression]then #codeblockelse #codeblockfiIf語句if[expression]then #codeblockelseif[expression] then #codeblock else #codeblock fifiif[expression];then #codeblockelif[expression] then #codeblock else #codeblock fifi比較比較操作整數(shù)操作字符串操作相同-eq=不同-ne!=大于-gt>小于-lt<大于或等于-ge小于或等于-le為空-z不為空-n比較例:比較整數(shù)a和b是否相等:if[$a=$b](也可用eq)判斷整數(shù)a是否大于整數(shù)b:if[$a-gt$b]比較字符串a(chǎn)和b是否相等:if[$a=$b]判斷字符串a(chǎn)是否為空:if[-z$a]判斷整數(shù)變量a是否大于b:if[$a-gt$b]注意:在“[”和“]”符號的左右都留有空格“=”左右都有空格判斷-e文件已經(jīng)存在-f文件是普通文件-s文件大小不為零-d文件是一個目錄-r文件對當前用戶可以讀取-w文件對當前用戶可以寫入-x文件對當前用戶可以執(zhí)行判斷例:sh5(演示):#!/bin/shdir=/home[-r"$dir"]&&echo"Canread$folder"[-f"$dir"]||echo"thisisnotfile"For循環(huán) for循環(huán)結(jié)構(gòu)與C語言中有所不同,在BASH中for循環(huán)的基本結(jié)構(gòu)是(var是變量)forvarin[list]do #codeblockdone其中$var是循環(huán)控制變量,[list]是var需要遍歷的一個集合,do/done對包含了循環(huán)體,相當于C語言中的一對大括號。另外如果do和for被寫在同一行,必須在do前面加上“;”。

如:for$varin[list];doFor循環(huán)例:sh6(演示):#!/bin/bashfordayinSunMonTueWedThuFriSatdo echo$daydoneFor循環(huán)如果列表被包含在一對雙引號中,則被認為是一個元素,如S8:#!/bin/bashfordayin"SunMonTueWedThuFriSat

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論