版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
入門Shell腳本最常用于系統(tǒng)管理工作,或者用于結(jié)合現(xiàn)有的程序以完成小型、特定的工作。腳本編程語言與編譯型語言的差異許多中、大型程序都是編譯型語言,如Fortran.Ada、C、C++或者Java(有些特殊)。這類程序只要從源代碼(SourceCode)轉(zhuǎn)換成目標代碼(ObjectCode)便能直接通過計算機執(zhí)行。這樣的好處是高效,缺點是它們多半運行于底層,處理的是字節(jié)、數(shù)字或是機器層級的對象,很難進行“將一個目錄里所有文件復制到另一個目錄中”這類對文件的簡單操作。簡單性可移植性開發(fā)容易一個簡單的腳本腳本語言通常是解釋型(interpreted)的,由解釋器(interpreter)讀入程序代碼,將其轉(zhuǎn)換成內(nèi)部形式。好處是它們多半運行在比編譯型語言高的層次,能夠輕易處理文件與目錄之類的對象,缺點是效率不如編譯型。但是編寫更快,而且目前的速度也已經(jīng)足夠快,常用腳本語言有:awk、Perl、Python、Ruby與Shell簡單性可移植性開發(fā)容易一個簡單的腳本.who命令可以知道系統(tǒng)有誰登陸,如果有很多用戶在登陸,結(jié)果會很長,可以使用wc(字數(shù)統(tǒng)計)命令,算出行數(shù)(line)、字數(shù)(word)和字符數(shù)(character)??梢允褂脀c-1,只計算出行數(shù)$whoIwc-l建立文件,使用混,夏制終端的輸入程序的內(nèi)容Ctrl-D表示end-of-file讓文件擁有tM亍的權限執(zhí)行測試|管道符號可以在兩個命令之間建立管道(建立文件,使用混,夏制終端的輸入程序的內(nèi)容Ctrl-D表示end-of-file讓文件擁有tM亍的權限執(zhí)行測試$ceijt>nuserswhoIwc-1AD$chmod+xnusers$./nusers其實在Shell中開發(fā)周期很類似,先直接在命令行上測試,之后寫入到獨立的腳本中。第一行的#!當Shell執(zhí)行一個程序時,要求Unix內(nèi)核啟動一個新的進程(process),在該進程里執(zhí)行指定的程序。內(nèi)核知道怎樣為編譯型程序執(zhí)行,但Shell是解釋型程序,當Shell要求內(nèi)核執(zhí)行時,內(nèi)核無法執(zhí)行,會回應”notexecutableformatfile”不是可執(zhí)行的格式文件的錯誤信息。Shell收到此錯誤信息時,就會確定不是編譯型程序,是Shell腳本,接著會啟動一個新的/bin/sh副本來執(zhí)行該程序。在當前有很多種Shell,需要通過第一行#!來指定用哪個Shell來執(zhí)行。一般如下:#!解釋器地址選項比如標準的Shell腳本:#!/bin/sh或者獨立的awk程序:#!/bin/awk-f這樣就表示為是一個awk程序。下面有些陷阱(gotchas)需要注意:系統(tǒng)對第一行#!長度是有限制的,從63到1024個字符不等,因此盡量不要超過64個字符別在選項之后放置任何空白,因為空白也會跟著選項一起傳遞給被引用程序知道解釋器的完整路徑,可以用來規(guī)避可一直行問題。下面的寫法可以避免某種程度的欺騙式攻擊(SpoofingAttack)0即添加選項符-,但不添加選項內(nèi)容#!/bin/sh-Shell元素命令與參數(shù)Shell最基本工作就是執(zhí)行命令。以空白隔開命令行的各個部分。命令行可以有選項option,分號;可用來分割同一行里的多條命令。如果使用的是&符號而不是分號,則Shell將在后臺執(zhí)行其前面的命令,即Shell不用等到該命令完成,就可以繼續(xù)執(zhí)行下一個命令。變量Shell里變量值可以是(而且通常是)空值null,即不包含任何字符。變量名以字母或者下劃線開頭,后面接任意長度的字母、數(shù)字或下劃線。定義如下:first=hello引用該變量值,前面加上$,如echo$first如果值中含有空格時,需要加上引號。second=Helloworldone當將幾個變量連接起來時,需要使用引號:fullname="$first$second”printf輸出echo輸出在不同Unix版本之間選項有很大不同。有了printf命令,它模仿C程序庫的printf()。語法格式如下:printfstringarguments例子:printf“Thefirstprogramalwaysprints?%s,%s!'\n”HelloWorldI/O重定向標準輸入(standardinput)、標準輸出(standardoutput)和標準錯誤輸出(standarderror)。默認情況下,許多Unix程序會讀取標準輸入、寫入標準輸出,并將錯誤信息傳遞給標準錯誤輸出。這類程序叫做過濾器(filter)。默認的這三類都是終端,通過cat命令可知:[mpsp^ubp-developftp]Scathellohello^owareyou^lowareyojhatisyournamehatisyojrname輸入cat后,沒有指定任何參數(shù),讀取標準輸入,寫入標準輸出,當輸入hello后,cat返回。a)以<改變標準輸入:program<file可將program的標準輸入修改為file:首先向num文件中輸入數(shù)據(jù),之后使用tr-d?r'命令:II[mpsp@ubp-developshel1study]$tr-d'r'<num23IIhelloOUhowaeOUtr用來從標準輸入中通過替換或刪除操作進行字符轉(zhuǎn)換。tr主要用于刪除文件中控制字符或進行字符轉(zhuǎn)換。使用tr時要轉(zhuǎn)換兩個字符串:字符串1用于查詢,字符串2用于處理各種轉(zhuǎn)換。tr剛執(zhí)行時,字符串1中的字符被映射到字符串2中的字符,然后轉(zhuǎn)換操作開始。帶有最常用選項的tr命令格式為:tr-c-d-s["string1_to_translate_from"]["string2_to_translate_to"]<input-file-c用字符串1中字符集的補集替換此字符集,要求字符集為ASCII。-d刪除字符串1中所有輸入字符。-s刪除所有重復出現(xiàn)字符序列,只保留第一個;即將重復出現(xiàn)字符串壓縮為一個字符串。input-file是轉(zhuǎn)換文件名。雖然可以使用其他格式輸入,但這種格式最常用。因此上面輸入重定向到文件num中,并刪除字符rb)以>改變標準輸出:重定向符在目的文件不存在時,會創(chuàng)建一個,有的話就會覆蓋。比如前面的cat>file可以使用>>在目的文件后面添加內(nèi)容。c)以I建立管道|前面命令的輸出會作為第二個命令的輸入。比如:tr-d'\r'<dos-file.txt|sort>Unix-file.txt上面管道會先刪除輸入文件的回車符,在完成數(shù)據(jù)排序后,將結(jié)果輸出到目的文件。Tr用于轉(zhuǎn)換字符特殊文件Unix有兩個有用的特殊文件,第一個是/dev/null,是位桶(bitbucket)。傳送到此文件的數(shù)據(jù)都會被系統(tǒng)丟掉。即當程序?qū)?shù)據(jù)寫入到此文件時,實際上什么事都不會做。[mpsp@ubp-deve"lopshe!1study]Scarnum123hellohowareyou'mpsp^ubp-developshe!1study]Scatnum>/dev/nul1'mpsp^ubp-developshe!1study]jcat/dev/nul1'mpsp^ubp-developshellstudy]$.
如果你需要的是命令的退出狀態(tài),而非它的輸出,此功能會很有用。例如測試一個文件是否包含某個模式(pattern)ifgreppatternmyfile>/dev/nullthen...找到模式時else...找不到模式時fi提示輸入關閉自動打印輸入字符的功能讀取密碼提示再輸入一次再讀取一次以確認別忘了打開自動打印輸入字符的功能另一個特殊文件時/dev/tty提示輸入關閉自動打印輸入字符的功能讀取密碼提示再輸入一次再讀取一次以確認別忘了打開自動打印輸入字符的功能printfMEnternewpassword:stty-echoreadpass</dev/ttyprintf"Enteragain:"readpass2</dev/ttysttyechostty(settty)命令用來控制終端的各種設置,-echo用來關閉自動打印每個輸入字符的功能。sttyecho用來恢復該功能。基本命令查找Shell會沿著查找路徑$PATH來尋找命令,這是以冒號分割的目錄列表,可以在列表指定的目錄下找到所要執(zhí)行的命令。默認路徑因系統(tǒng)而已,至少包含/bin與/usr/bin,如果要自己編寫腳本,準備自己的bin目錄來存放。步驟如下:$cd$cd$mkdirbinSmvnueerBbin$FATH=$PATH:$HOME/bin$nusers切換到home目錄建立個人bin目錄將我們的腳本置入該目錄將個人的bin目錄附加到PATH試試看Shell有找到并執(zhí)行它要讓修改永久生效,在.profile文件中把你的bin目錄假如$PATH,每次登錄時Shell都將讀取.profile文件。訪問Shell腳本參數(shù)位置參數(shù)(positionparameters)指的是Shell腳本的命令行參數(shù)。參數(shù)使用”$數(shù)字”的形式表示,當參數(shù)大于9時,使用${數(shù)字}。比如我們使用whoIgrepmushui命令來查找登錄用戶mushui的信息。寫成Shell腳本為:[mpsg@ubp-developshel1study]5cat>fincluserwho|grep$1[mpsp^ubp-developshellstudy]Schmod+xflnduser[mpsp@ubp-developshellstudy]5./findusermp^p但是現(xiàn)在這個shell只能處理有參數(shù)的,如果沒有參數(shù)會出錯:[mpsp@ubp-developshel1study]S./finduser用法:grep[逸項]...PATTERN[FILE]...謨用心Ep—h曰P'來荻彳號豆多信息。簡單的執(zhí)行跟著程序執(zhí)行出錯時,可以把執(zhí)行跟蹤(executiontracing)的功能打開。這會使Shell顯示每個被執(zhí)行到的命令,并在前面加”+”:一個加號后面跟著一個空格??梢栽趫?zhí)行腳本時,使用sh-x腳本腳本的方式執(zhí)行跟蹤功能。也可以在腳本中添加set-x打開跟蹤功能,使用set+x關閉跟蹤功能。查找與替換查找文本有三種程序可以用來查找整個文本文件:grep,使用基本的正則表達式egrep,使用擴展的正則表達式fgrep,快速grep,匹配固定字符串而不是正則表達式,并且grep與egrap只能匹配單個正則表達式,而fgrep使用不同算法,能匹配多個字符串。grep-E相當于egrepgrep-F相當于是fgrep-i列出匹配模式的文件名稱,而不是打印匹配的行-q如果模式匹配成功,則grep會成功離開,不講匹配的行寫入標準輸出,否則即使不成功。-s不顯示錯誤信息,通常與-q并用-v顯示不匹配的行使用cut選定字段cut命令用來剪下文本文件里的數(shù)據(jù),可以是字段類型或是字符類型。注意:一個制表符再次被視為單個字符。下面命令可顯示系統(tǒng)上每個用戶的登錄名及其全名:cut-d:-f1,5/etc/passwdcut語法如下:cut-clist[file...]cut-flist[-ddelim][file...]主要選項:-clist以字符為主,執(zhí)行剪下的操作。list為字符編號或一段范圍的列表(以逗號分割),如1,3,5-12,42-ddelim通過-f選項,使用delim作為定界符,上例中即使用“:”作為定界符。默認為制表符。-flist以字段為主,作剪下的操作。list為字段編號或一段范圍的列表。例子中即代表取第1個和第5個。使用join連接字段join命令可以將多個文件結(jié)合在一起,每個文件里的每條記錄,共享一個鍵值key,鍵值指的是記錄中的主字段。語法為:join[option...]file1file2選項:-1field1-2field2標明要結(jié)合的字段,-1field1指的是從file1取出field1,從file2中取field2,字段編號從1開始。-ofile.field輸出file文件的field字段。可以使用多個-o選項,輸出多個字段。-tseparator使用separator分隔符,此字符頁尾輸出的字段分隔符。例子如下:$catsales顯示sales文件#業(yè)務員數(shù)據(jù)注釋說明#業(yè)務員量TOC\o"1-5"\h\zjoe100jane200Herman150chris300$catquotas顯示quotas文件#配額#業(yè)務員配額TOC\o"1-5"\h\zjoe50jane75herman80Chris95腳本如下:#結(jié)合配額與業(yè)務員數(shù)據(jù)#刪除注釋并排序數(shù)據(jù)文件sed'/A#/drquotasIsort>quotas.sortedsedf/rt#/drsalesIsort>sales-sorted#以第一個鍵值作結(jié)合,將結(jié)果產(chǎn)生至標準輸出joinquotas.sortedsales.sorted#刪除緩存文件rmquotas.sortedsales4sorted執(zhí)行結(jié)果為:$./mergeTsales■ehchris95300herman80150jane75200joe50100sed程序一般執(zhí)行文本替換的程序時sed,流編輯器(StreamEditor)。一般在管道中間使用sed來執(zhí)行替換操作。做法是使用s命令-要求正則表達式尋找,用替代文本(replacement「。乂。替換匹配的文本。awk命令awk主要功能為做一些簡易的文本處理,如取出字段并重新編排。語法:awk'program'[file...]awk讀取命令行上指定的各個文件(若無,則為標準輸入),一次讀取一行記錄,針對每一行,執(zhí)行應用程序指定的命令。awk程序基本構架為:pattern{action}pattern或是action都能省略。省略patter,則會對每條記錄執(zhí)行action,省略action怎等于{print}。awk讀取輸入記錄,然后自動將各個記錄切分為字段,awk將每條記錄內(nèi)的字段數(shù)目,存儲到內(nèi)建變量NF。如需字段值,搭配$字符。下面幾個例子:awk1(printawk'(printawk1awk1(printawk'(printawk1{printawkrNF>0{print$0}1awkJNF>0打即第工個字段(未指定pattern).打印第2與第5個字段(未指定pattern)''打印第1個與最后一個字段(未指定pattern)打印非空行(指定pattern與action)同上(未指定action,則默認為打印)編號為0的字段表示整條記錄。可以使用-F分割符的方式來設置分隔符。如對于/etc/passwd文件的內(nèi)容:$awk-F:*{print$lf$5}'/etc/paaswd處理/etc/passwdroot■root”’?'?■管理詠號:tolstoyLeoTolstoy實際用戶austenJaneAustencamusAlb
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024藝術品拍賣與宣傳推廣綜合服務合同3篇
- 2025年度環(huán)保設施PPP項目合作合同范本3篇
- 2025年度智能車庫產(chǎn)權交易合同范本4篇
- 2025年度文化產(chǎn)業(yè)園開發(fā)與租賃合同3篇
- 2025年企事業(yè)單位食堂承包與托管全面合作協(xié)議12篇
- 2025年度廠長任期項目投資與風險管理合同3篇
- 2025年中投中財基金管理有限公司招聘筆試參考題庫含答案解析
- 2025年中化集團中化能源物流公司招聘筆試參考題庫含答案解析
- 二零二五版美容院專業(yè)護膚技術研發(fā)與轉(zhuǎn)讓合同4篇
- 二零二五版門窗安裝工程環(huán)保驗收合同2篇
- MT/T 199-1996煤礦用液壓鉆車通用技術條件
- GB/T 6144-1985合成切削液
- GB/T 10357.1-2013家具力學性能試驗第1部分:桌類強度和耐久性
- 第三方在線糾紛解決機制(ODR)述評,國際商法論文
- 第5章-群體-團隊溝通-管理溝通
- 腎臟病飲食依從行為量表(RABQ)附有答案
- 深基坑-安全教育課件
- 園林施工管理大型園林集團南部區(qū)域養(yǎng)護標準圖例
- 排水許可申請表
- 低血糖的觀察和護理課件
- 計量檢定校準技術服務合同協(xié)議書
評論
0/150
提交評論