Shell腳本學(xué)習(xí)指南筆記.doc_第1頁(yè)
Shell腳本學(xué)習(xí)指南筆記.doc_第2頁(yè)
Shell腳本學(xué)習(xí)指南筆記.doc_第3頁(yè)
Shell腳本學(xué)習(xí)指南筆記.doc_第4頁(yè)
Shell腳本學(xué)習(xí)指南筆記.doc_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

入門Shell腳本最常用于系統(tǒng)管理工作,或者用于結(jié)合現(xiàn)有的程序以完成小型、特定的工作。腳本編程語(yǔ)言與編譯型語(yǔ)言的差異許多中、大型程序都是編譯型語(yǔ)言,如Fortran、Ada、C、C+或者Java(有些特殊)。這類程序只要從源代碼(Source Code)轉(zhuǎn)換成目標(biāo)代碼(Object Code)便能直接通過(guò)計(jì)算機(jī)執(zhí)行。這樣的好處是高效,缺點(diǎn)是它們多半運(yùn)行于底層,處理的是字節(jié)、數(shù)字或是機(jī)器層級(jí)的對(duì)象,很難進(jìn)行“將一個(gè)目錄里所有文件復(fù)制到另一個(gè)目錄中”這類對(duì)文件的簡(jiǎn)單操作。腳本語(yǔ)言通常是解釋型(interpreted)的,由解釋器(interpreter)讀入程序代碼,將其轉(zhuǎn)換成內(nèi)部形式。好處是它們多半運(yùn)行在比編譯型語(yǔ)言高的層次,能夠輕易處理文件與目錄之類的對(duì)象,缺點(diǎn)是效率不如編譯型。但是編寫(xiě)更快,而且目前的速度也已經(jīng)足夠快,常用腳本語(yǔ)言有:awk、Perl、Python、Ruby與Shell。Shell的特點(diǎn)有:1. 簡(jiǎn)單性2. 可移植性3. 開(kāi)發(fā)容易一個(gè)簡(jiǎn)單的腳本who命令可以知道系統(tǒng)有誰(shuí)登陸,如果有很多用戶在登陸,結(jié)果會(huì)很長(zhǎng),可以使用wc(字?jǐn)?shù)統(tǒng)計(jì))命令,算出行數(shù)(line)、字?jǐn)?shù)(word)和字符數(shù)(character)??梢允褂脀c l,只計(jì)算出行數(shù)$ who | wc l| 管道符號(hào)可以在兩個(gè)命令之間建立管道(pipeline):who的輸出成為了wc的輸入。下面就寫(xiě)一個(gè)shell腳本將管道轉(zhuǎn)變成一個(gè)獨(dú)立的命令。其實(shí)在Shell中開(kāi)發(fā)周期很類似,先直接在命令行上測(cè)試,之后寫(xiě)入到獨(dú)立的腳本中。第一行的#!當(dāng)Shell執(zhí)行一個(gè)程序時(shí),要求Unix內(nèi)核啟動(dòng)一個(gè)新的進(jìn)程(process),在該進(jìn)程里執(zhí)行指定的程序。內(nèi)核知道怎樣為編譯型程序執(zhí)行,但Shell是解釋型程序,當(dāng)Shell要求內(nèi)核執(zhí)行時(shí),內(nèi)核無(wú)法執(zhí)行,會(huì)回應(yīng)”not executable format file”不是可執(zhí)行的格式文件的錯(cuò)誤信息。Shell收到此錯(cuò)誤信息時(shí),就會(huì)確定不是編譯型程序,是Shell腳本,接著會(huì)啟動(dòng)一個(gè)新的/bin/sh副本來(lái)執(zhí)行該程序。在當(dāng)前有很多種Shell,需要通過(guò)第一行#!來(lái)指定用哪個(gè)Shell來(lái)執(zhí)行。一般如下:#! 解釋器地址 選項(xiàng)比如標(biāo)準(zhǔn)的Shell腳本:#! /bin/sh或者獨(dú)立的awk程序:#! /bin/awk f 這樣就表示為是一個(gè)awk程序。下面有些陷阱(gotchas)需要注意:1. 系統(tǒng)對(duì)第一行#!長(zhǎng)度是有限制的,從63到1024個(gè)字符不等,因此盡量不要超過(guò)64個(gè)字符2. 別在選項(xiàng)之后放置任何空白,因?yàn)榭瞻滓矔?huì)跟著選項(xiàng)一起傳遞給被引用程序3. 知道解釋器的完整路徑,可以用來(lái)規(guī)避可一直行問(wèn)題。 下面的寫(xiě)法可以避免某種程度的欺騙式攻擊(Spoofing Attack)。即添加選項(xiàng)符-,但不添加選項(xiàng)內(nèi)容#! /bin/sh -Shell元素命令與參數(shù)Shell最基本工作就是執(zhí)行命令。以空白隔開(kāi)命令行的各個(gè)部分。命令行可以有選項(xiàng)option,分號(hào);可用來(lái)分割同一行里的多條命令。如果使用的是&符號(hào)而不是分號(hào),則Shell將在后臺(tái)執(zhí)行其前面的命令,即Shell不用等到該命令完成,就可以繼續(xù)執(zhí)行下一個(gè)命令。變量Shell里變量值可以是(而且通常是)空值null,即不包含任何字符。變量名以字母或者下劃線開(kāi)頭,后面接任意長(zhǎng)度的字母、數(shù)字或下劃線。定義如下:first = hello引用該變量值,前面加上$,如echo $first如果值中含有空格時(shí),需要加上引號(hào)。second = Hello world one當(dāng)將幾個(gè)變量連接起來(lái)時(shí),需要使用引號(hào):fullname = “$first $second”printf輸出echo輸出在不同Unix版本之間選項(xiàng)有很大不同。有了printf命令,它模仿C程序庫(kù)的printf()。語(yǔ)法格式如下:printf string arguments例子:printf “The first program always prints %s, %s!n” Hello WorldI/O重定向標(biāo)準(zhǔn)輸入(standard input)、標(biāo)準(zhǔn)輸出(standard output)和標(biāo)準(zhǔn)錯(cuò)誤輸出(standard error)。默認(rèn)情況下,許多Unix程序會(huì)讀取標(biāo)準(zhǔn)輸入、寫(xiě)入標(biāo)準(zhǔn)輸出,并將錯(cuò)誤信息傳遞給標(biāo)準(zhǔn)錯(cuò)誤輸出。這類程序叫做過(guò)濾器(filter)。默認(rèn)的這三類都是終端,通過(guò)cat命令可知:輸入cat后,沒(méi)有指定任何參數(shù),讀取標(biāo)準(zhǔn)輸入,寫(xiě)入標(biāo)準(zhǔn)輸出,當(dāng)輸入hello后,cat返回。a) 以 改變標(biāo)準(zhǔn)輸入:program file可將program的標(biāo)準(zhǔn)輸入修改為file:首先向num文件中輸入數(shù)據(jù),之后使用tr d r命令:tr用來(lái)從標(biāo)準(zhǔn)輸入中通過(guò)替換或刪除操作進(jìn)行字符轉(zhuǎn)換。tr主要用于刪除文件中控制字符或進(jìn)行字符轉(zhuǎn)換。使用tr時(shí)要轉(zhuǎn)換兩個(gè)字符串:字符串1用于查詢,字符串2用于處理各種轉(zhuǎn)換。tr剛執(zhí)行時(shí),字符串1中的字符被映射到字符串2中的字符,然后轉(zhuǎn)換操作開(kāi)始。 帶有最常用選項(xiàng)的tr命令格式為: tr -c -d -s string1_to_translate_from string2_to_translate_to 改變標(biāo)準(zhǔn)輸出:重定向符在目的文件不存在時(shí),會(huì)創(chuàng)建一個(gè),有的話就會(huì)覆蓋。比如前面的cat file可以使用在目的文件后面添加內(nèi)容。c) 以 | 建立管道| 前面命令的輸出會(huì)作為第二個(gè)命令的輸入。比如:tr -d r Unix-file.txt上面管道會(huì)先刪除輸入文件的回車符,在完成數(shù)據(jù)排序后,將結(jié)果輸出到目的文件。Tr用于轉(zhuǎn)換字符特殊文件Unix有兩個(gè)有用的特殊文件,第一個(gè)是/dev/null,是位桶(bit bucket)。傳送到此文件的數(shù)據(jù)都會(huì)被系統(tǒng)丟掉。即當(dāng)程序?qū)?shù)據(jù)寫(xiě)入到此文件時(shí),實(shí)際上什么事都不會(huì)做。如果你需要的是命令的退出狀態(tài),而非它的輸出,此功能會(huì)很有用。例如測(cè)試一個(gè)文件是否包含某個(gè)模式(pattern)if grep pattern myfile /dev/nullthen 找到模式時(shí)else 找不到模式時(shí)fi另一個(gè)特殊文件時(shí)/dev/tty。當(dāng)程序打開(kāi)此文件時(shí),Unix會(huì)自動(dòng)將它重定向到一個(gè)終端再與程序結(jié)合。這在程序必須讀取人工輸入時(shí)(如密碼)特別有用。此外,用它來(lái)產(chǎn)生錯(cuò)誤信息也很方便,但很少有人這么用。stty(set tty)命令用來(lái)控制終端的各種設(shè)置,-echo用來(lái)關(guān)閉自動(dòng)打印每個(gè)輸入字符的功能。stty echo用來(lái)恢復(fù)該功能?;久畈檎襍hell會(huì)沿著查找路徑$PATH來(lái)尋找命令,這是以冒號(hào)分割的目錄列表,可以在列表指定的目錄下找到所要執(zhí)行的命令。默認(rèn)路徑因系統(tǒng)而已,至少包含/bin與/usr/bin,如果要自己編寫(xiě)腳本,準(zhǔn)備自己的bin目錄來(lái)存放。步驟如下:要讓修改永久生效,在.profile文件中把你的bin目錄假如$PATH,每次登錄時(shí)Shell都將讀取.profile文件。訪問(wèn)Shell腳本參數(shù)位置參數(shù)(position parameters)指的是Shell腳本的命令行參數(shù)。參數(shù)使用”$數(shù)字”的形式表示,當(dāng)參數(shù)大于9時(shí),使用$數(shù)字。比如我們使用who | grep mushui命令來(lái)查找登錄用戶mushui的信息。寫(xiě)成Shell腳本為:但是現(xiàn)在這個(gè)shell只能處理有參數(shù)的,如果沒(méi)有參數(shù)會(huì)出錯(cuò):簡(jiǎn)單的執(zhí)行跟著程序執(zhí)行出錯(cuò)時(shí),可以把執(zhí)行跟蹤(execution tracing)的功能打開(kāi)。這會(huì)使Shell顯示每個(gè)被執(zhí)行到的命令,并在前面加”+”:一個(gè)加號(hào)后面跟著一個(gè)空格??梢栽趫?zhí)行腳本時(shí),使用sh x 腳本 腳本的方式執(zhí)行跟蹤功能。也可以在腳本中添加set x打開(kāi)跟蹤功能,使用set +x 關(guān)閉跟蹤功能。查找與替換查找文本有三種程序可以用來(lái)查找整個(gè)文本文件:1. grep,使用基本的正則表達(dá)式2. egrep,使用擴(kuò)展的正則表達(dá)式3. fgrep,快速grep,匹配固定字符串而不是正則表達(dá)式,并且grep與egrap只能匹配單個(gè)正則表達(dá)式,而fgrep使用不同算法,能匹配多個(gè)字符串。grep E 相當(dāng)于egrepgrep F相當(dāng)于是fgrep-i 列出匹配模式的文件名稱,而不是打印匹配的行-q 如果模式匹配成功,則grep會(huì)成功離開(kāi),不講匹配的行寫(xiě)入標(biāo)準(zhǔn)輸出,否則即使不成功。-s 不顯示錯(cuò)誤信息,通常與-q并用-v 顯示不匹配的行使用cut選定字段cut命令用來(lái)剪下文本文件里的數(shù)據(jù),可以是字段類型或是字符類型。注意:一個(gè)制表符再次被視為單個(gè)字符。下面命令可顯示系統(tǒng)上每個(gè)用戶的登錄名及其全名:cut語(yǔ)法如下:cut -c list filecut -f list -d delim file主要選項(xiàng):-c list 以字符為主,執(zhí)行剪下的操作。list為字符編號(hào)或一段范圍的列表(以逗號(hào)分割),如1,3,5-12,42-d delim 通過(guò)-f選項(xiàng),使用delim作為定界符,上例中即使用“:”作為定界符。默認(rèn)為制表符。-f list 以字段為主,作剪下的操作。list為字段編號(hào)或一段范圍的列表。例子中即代表取第1個(gè)和第5個(gè)。使用join連接字段join命令可以將多個(gè)文件結(jié)合在一起,每個(gè)文件里的每條記錄,共享一個(gè)鍵值key,鍵值指的是記錄中的主字段。語(yǔ)法為:join option file1 file2選項(xiàng):-1 field1-2 field2標(biāo)明要結(jié)合的字段,-1 field1指的是從file1取出field1,從file2中取field2,字段編號(hào)從1開(kāi)始。-o file.field輸出file文件的field字段。可以使用多個(gè)-o選項(xiàng),輸出多個(gè)字段。-t separator使用separator分隔符,此字符頁(yè)尾輸出的字段分隔符。例子如下:腳本如下:執(zhí)行結(jié)果為:sed程序一般執(zhí)行文本替換的程序時(shí)sed,流編輯器(Stream Editor)。一般在管道中間使用sed來(lái)執(zhí)行替換操作。做法是使用s命令-要求正則表達(dá)式尋找,用替代文本(replacement text)替換匹配的文本。awk命令awk主要功能為做一些簡(jiǎn)易的文本處理,如取出字段并重新編排。語(yǔ)法:awk program file awk讀取命令行上指定的各個(gè)文件(若無(wú),則為標(biāo)準(zhǔn)輸入),一次讀取一行記錄,針對(duì)每一行,執(zhí)行應(yīng)用程序指定的命令。awk程序基本構(gòu)架為:pattern actionpattern或是action都能省略。省略patter,則會(huì)對(duì)每條記錄執(zhí)行action,省略action怎等于print。awk讀取輸入記錄,然后自動(dòng)將各個(gè)記錄切分為

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論