




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二章Linux程序設(shè)計(jì)基礎(chǔ)本章學(xué)習(xí)目標(biāo)通過(guò)對(duì)本章的學(xué)習(xí),讀者應(yīng)該掌握以下主要內(nèi)容:Linux編程風(fēng)格Linux下使用GNUcc開(kāi)發(fā)應(yīng)用程序Linux程序的調(diào)試1特制分析1.概述1.1Linux應(yīng)用軟件開(kāi)發(fā):Linux開(kāi)發(fā)具有活躍的開(kāi)發(fā)環(huán)境,Linux開(kāi)發(fā)工作一般是由多個(gè)Linux用戶(hù)共同完成一個(gè)項(xiàng)目的。開(kāi)發(fā)工作完成后,該軟件就被放到Internet站點(diǎn)上,任何用戶(hù)都可以訪問(wèn)和下載它。大多數(shù)Linux軟件是經(jīng)過(guò)自由軟件基金會(huì)提供的GNU公開(kāi)認(rèn)證授權(quán)的,因而通常被稱(chēng)作GNU軟件。GNU軟件免費(fèi)提供給用戶(hù)使用,并被證明是非??煽亢透咝У?。2特制分析Linux程序設(shè)計(jì)基礎(chǔ)1、Linux下c程序開(kāi)發(fā)2、Linux下的shell編程3特制分析Linux下的C語(yǔ)言C語(yǔ)言是一門(mén)“中級(jí)語(yǔ)言”,是匯編語(yǔ)言和高級(jí)語(yǔ)言過(guò)渡的一種語(yǔ)言,但是它既具有高級(jí)語(yǔ)言簡(jiǎn)單易懂、靈活方便的特點(diǎn),同時(shí),他又具有匯編語(yǔ)言的執(zhí)行高效和可對(duì)硬件直接操作的特點(diǎn)。C語(yǔ)言的應(yīng)用進(jìn)行底層的開(kāi)發(fā):如內(nèi)核開(kāi)發(fā)及基于linux的嵌入式開(kāi)發(fā)。進(jìn)行頂層的開(kāi)發(fā):
如linux下的應(yīng)用程序的開(kāi)發(fā)4特制分析一個(gè)完整的開(kāi)發(fā)工具應(yīng)該包括:編輯工具:vi編輯器編譯工具:gcc調(diào)試工具:gdb配置、項(xiàng)目管理工具2.1Linux下c程序開(kāi)發(fā)函數(shù)庫(kù)及系統(tǒng)頭文件:集成開(kāi)發(fā)環(huán)境IDEKylixKdevelopRHIDELinux安裝時(shí)完成了這些5特制分析Linux下c程序的開(kāi)發(fā)過(guò)程:使用vi等編輯工具編寫(xiě)源程序保存為*.c使用gcc編譯成二進(jìn)制可執(zhí)行文件./文件名執(zhí)行有問(wèn)題可以用gdb進(jìn)行調(diào)試6特制分析一、編輯工具:
在Linux下編程,你不再擁有集成化環(huán)境,你可以使用類(lèi)似于記事本的工具---經(jīng)典的vi來(lái)編輯源程序。當(dāng)然,還有更高檔一些的,如joe、emacs等??傊?,編輯程序與編譯工作是分開(kāi)的。
vi編輯器有三種工作模式:命令行模式插入模式底行模式編輯hello.c7特制分析1)命令行模式:
用戶(hù)在用vi編輯文件時(shí),最初進(jìn)入的一般模式,此時(shí)鍵盤(pán)輸入當(dāng)做命令。在該模式中可以進(jìn)行光標(biāo)移動(dòng)、刪除、復(fù)制、粘貼等操作,但是無(wú)法編輯文字。8特制分析命令功能h方向鍵,向左移動(dòng)光標(biāo)一個(gè)字符的位置,相當(dāng)于鍵“←”j方向鍵,向下移動(dòng)光標(biāo)到下一行的位置,相當(dāng)于鍵“↓”k方向鍵,向上移動(dòng)光標(biāo)到上一行的位置,相當(dāng)于鍵“↑”l方向鍵,向右移動(dòng)光標(biāo)一個(gè)字符的位置,相當(dāng)于鍵“→”:N移動(dòng)光標(biāo)到第N行(N待定)1G移動(dòng)光標(biāo)到文件的第1行G移動(dòng)光標(biāo)到文件的最后1行光標(biāo)命令9特制分析命令功能[N]x(Expurgate)刪除從光標(biāo)位置開(kāi)始的連續(xù)N個(gè)字符(并復(fù)制到編輯緩沖區(qū))[N]dd(Delete)刪除從光標(biāo)位置開(kāi)始的連續(xù)N行(并復(fù)制到編輯緩沖區(qū))[N]yy(Yank)復(fù)制從光標(biāo)位置開(kāi)始的連續(xù)N行到編輯緩沖區(qū)p(Put)從編輯緩沖區(qū)復(fù)制文本到當(dāng)前光標(biāo)位置(即粘貼)u(Undo)取消上一次操作(即恢復(fù)功能)編輯命令10特制分析2)插入模式:在該模式下,vi編輯器進(jìn)入編輯狀態(tài):狀態(tài)命令命令功能a(Append)進(jìn)入編輯狀態(tài),從當(dāng)前光標(biāo)之前的位置開(kāi)始插入鍵盤(pán)輸入的字符i(Insert)進(jìn)入編輯狀態(tài),從當(dāng)前光標(biāo)之后的位置開(kāi)始插入鍵盤(pán)輸入的字符o(Open)進(jìn)入編輯狀態(tài),并插入一新行,光標(biāo)移到該新行的行首,以后鍵盤(pán)輸入的字符將插入到光標(biāo)位置ESC進(jìn)入命令狀態(tài)11特制分析3)末行模式:在該模式下,vi編輯器實(shí)現(xiàn)文件的保存和退出。命令功能:q(Quit)退出沒(méi)有被修改的文件(若文件被修改了而沒(méi)有保存,則此命令無(wú)效):q!強(qiáng)制退出,且不保存修改過(guò)的部分:w(Write)保存文件,但不退出:w!強(qiáng)制保存文件,但不退出:wq/:x(Exit)保存文件并退出:x!強(qiáng)制保存文件并退出:wFile另存為File給出的文件名,不退出:w!File強(qiáng)制另存為File給出的文件名,不退出:rFile(Read)讀入File指定的文件內(nèi)容插入到光標(biāo)位置12特制分析2、編譯工具:gccgcc是gnu推出的功能強(qiáng)大性能優(yōu)越的多平臺(tái)編譯器,gcc能將c、c++、Fottran等語(yǔ)言源文件進(jìn)行編譯、連接生成可執(zhí)行文件。gcc支持下面后綴名的文件:.cc語(yǔ)言源文件.hc語(yǔ)言頭文件
.i已經(jīng)預(yù)處理的源文件.o編譯后的目標(biāo)文件.s匯編語(yǔ)言源代碼文件gcc–v查詢(xún)gcc的版本號(hào)13特制分析Gcc編譯過(guò)程:預(yù)處理鏈接匯編組譯源程序(*.c)可執(zhí)行文件ELF格式預(yù)處理器匯編器組譯器連接器.o目標(biāo)文件14特制分析gcc的使用格式如下:gcc[options][filenames]
當(dāng)使用gcc時(shí),gcc會(huì)完成預(yù)處理、編譯、匯編和連接。前三步生成目標(biāo)文件,連接時(shí),把生成的目標(biāo)文件鏈接成可執(zhí)行文件。gcc可以針對(duì)支持不同的源程序文件進(jìn)行不同處理,文件格式以文件的后綴來(lái)識(shí)別。 gcc-o目標(biāo)文件名源文件名(.c形式的文件)如gcc–ohellohello.c./可執(zhí)行文件名
進(jìn)行執(zhí)行文件15特制分析16特制分析gcc–otest.o–ctest.cgcc–ctest.c
僅把源代碼編譯為目標(biāo)代碼而跳過(guò)連接,優(yōu)點(diǎn):當(dāng)編譯多個(gè)c程序時(shí)速度更快,易于管理。gcc–WALL–otesttest1.ctest2.ctest3.c
有多個(gè)源文件生成test,不產(chǎn)生警告信息gcc–ctest.c-otest.ogcc–g–ohellohello.c
編譯生成可執(zhí)行連接文件hello同時(shí)生成供調(diào)試的信息。17特制分析使用優(yōu)化選項(xiàng)
當(dāng)用gcc編譯C代碼時(shí),它會(huì)試著用最少的時(shí)間完成編譯并且使編譯后的代碼易于調(diào)試.易于調(diào)試意味著編譯后的代碼與源代碼有同樣的執(zhí)行次序,編譯后的代碼沒(méi)有經(jīng)過(guò)優(yōu)化。有很多選項(xiàng)可用于告訴gcc,在耗費(fèi)更多編譯時(shí)間和犧牲易調(diào)試性的基礎(chǔ)上,產(chǎn)生更小更快的可執(zhí)行文件。這些選項(xiàng)中最典型的是-O和-O2選項(xiàng)。18特制分析-O選項(xiàng)告訴gcc對(duì)源代碼進(jìn)行基本優(yōu)化。這些優(yōu)化在大多數(shù)情況下都會(huì)使程序執(zhí)行的更快。
-O2選項(xiàng)告訴gcc產(chǎn)生盡可能小和盡可能快的代碼。-O2選項(xiàng)將使編譯的速度比使用-O時(shí)慢。但通常產(chǎn)生的代碼執(zhí)行速度會(huì)更快。Gcc主要完成程序的編譯和連接,任何一個(gè)源文件首先會(huì)生成中間目標(biāo)文件,再由中間目標(biāo)文件生成執(zhí)行文件。19特制分析GNUmake管理項(xiàng)目1、包含多個(gè)源文件的項(xiàng)目在編譯時(shí)都有長(zhǎng)而復(fù)雜的命令行,每次都分別編譯鏈該項(xiàng)目,比較麻煩。2、當(dāng)某一個(gè)源文件被修改以后,則必須重新編譯和鏈接,最后生成可執(zhí)行文件。a.cb.ce.cf.c……Makefilea項(xiàng)目目錄#make
有了Makefile文件,我們只用一個(gè)make命令就可以自動(dòng)智能地根據(jù)當(dāng)前的文件修改的情況編譯所需要的文件和鏈接目標(biāo)程序。20特制分析
在執(zhí)行make指令時(shí)makefile的默認(rèn)文件名為GNUmakefile、makefile或Makefile,當(dāng)然也可以在make的命令行中指定別的文件名。一、make的執(zhí)行:#make–fmakefilename#maketarget(目標(biāo)文件)21特制分析Makefile的文件的基本結(jié)構(gòu):1、makefile是一個(gè)文本形式的數(shù)據(jù)庫(kù)文件,其中包含了一些規(guī)則告訴make處理哪些文件以及怎么處理這些文件。2、這些規(guī)則主要描述一些target目標(biāo)文件是從哪些依賴(lài)文件產(chǎn)生的,以及用什么命令來(lái)執(zhí)行該過(guò)程。依靠這些規(guī)則,make會(huì)對(duì)磁盤(pán)上的文件進(jìn)行檢查時(shí)間差,以便更新目標(biāo)文件。3、目標(biāo)文件不一定是最后的可執(zhí)行文件,可以是任何中間文件,并可以做為其他目標(biāo)文件的依賴(lài)文件。22特制分析#一個(gè)簡(jiǎn)單的Makefile的例子(以#開(kāi)頭的為注釋行)test:prog.ocode.o gcc–otestprog.ocode.o
prog.o:prog.cprog.hcode.h gcc–cprog.c–oprog.o
code.o:code.ccode.h gcc–ccode.c–ocode.o
clean:
rm–f*.o#make#makeMakefile#maketest命令行以tab鍵開(kāi)始偽目標(biāo):#makeclean23特制分析例如:用make編譯hello.c單一文件24特制分析
對(duì)于一個(gè)有很多源文件的項(xiàng)目,當(dāng)改變一個(gè)頭文件的時(shí)候,由于所有的依賴(lài)關(guān)系都在Makefile里,因此不再需要記住依賴(lài)此頭文件的所有源碼文件,make可以自動(dòng)的重新編譯所有那些因依賴(lài)這個(gè)頭文件而改變了的源碼文件,如果需要,再進(jìn)行重新連接。25特制分析Makefile文件的簡(jiǎn)化:1、利用Makefile中的自定義變量:Makefile里的變量就像一個(gè)環(huán)境變量。事實(shí)上,環(huán)境變量在make中也被解釋成make的變量。這些變量對(duì)大小寫(xiě)敏感,一般使用大寫(xiě)宇母。幾乎可以從任何地方引用定義的變量,變量的主要作用如下:
a、保存文件名列表b、保存可執(zhí)行命令名c、保存編譯器的參數(shù)變量引用:${VARNAME}26特制分析make解釋規(guī)則時(shí),VARNAME在等式右端展開(kāi)為定義它的字符串。變量一般都在Makefile的頭部定義。按照慣例,所有的Makefile變量都應(yīng)該是大寫(xiě)。如果變量的值發(fā)生變化,就只需要在一個(gè)地方修改,從而簡(jiǎn)化了Makefile的維護(hù)。27特制分析現(xiàn)在利用變量把前面的Makefile重寫(xiě)一遍:
OBJS=prog.ocode.o CC=gcc
test:${OBJS} ${CC}–otest${OBJS} prog.o:prog.cprog.hcode.h ${CC}–cprog.c–oprog.o code.o:code.ccode.h ${CC}–ccode.c–ocode.o
clean:
rm–f*.o28特制分析2、利用Makefile中的其它變量:29特制分析一個(gè)C編譯的具體命令將會(huì)是:${CC}${CFLAGS}${CPPFLAGS}–c$^-o$@CFLAGS:c編譯器的選項(xiàng)CPP:c預(yù)編譯器的名稱(chēng)默認(rèn)值為¥{cc}-ECPPFLAGS:c預(yù)編譯的選項(xiàng)TARGET_ARCH:目標(biāo)機(jī)器的結(jié)構(gòu)定義預(yù)定義變量30特制分析如:源程序?yàn)?1特制分析經(jīng)過(guò)變量替換過(guò)后的makefile文件:32特制分析3、利用Makefile中的隱含規(guī)則:現(xiàn)在利用變量把前面的Makefile重寫(xiě)一遍:
OBJS=prog.ocode.o CC=gcc
test:${OBJS} ${CC}–o$@$^ prog.o:prog.cprog.hcode.h code.o:code.ccode.h clean:
rm–f*.o33特制分析使用automake和autoconf產(chǎn)生Makefile
在開(kāi)始使用Automake和autoconf之前,請(qǐng)先確認(rèn)系統(tǒng)已經(jīng)安裝以下的軟件:
GNUAutomake GNUAutoconf GNUm4 Perl GNULibtool(如果你需要產(chǎn)生sharedlibrary)完成實(shí)驗(yàn)內(nèi)容34特制分析三、調(diào)試工具GDB:Linux系統(tǒng)中包含了GNU調(diào)試程序gdb,它是一個(gè)用來(lái)調(diào)試C和C++程序的調(diào)試器??梢允钩绦蜷_(kāi)發(fā)者在程序運(yùn)行時(shí)觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況。gdb所提供的一些功能如下:1、運(yùn)行程序,設(shè)置所有的能影響程序運(yùn)行的參數(shù)和環(huán)境;2、控制程序在指定的條件下停止運(yùn)行;3、當(dāng)程序停止時(shí),可以檢查程序的狀態(tài);4、修改程序的錯(cuò)誤,并重新運(yùn)行程序;5、動(dòng)態(tài)監(jiān)視程序中變量的值;6、可以單步執(zhí)行代碼,觀察程序的運(yùn)行狀態(tài)。35特制分析gdb的功能非常強(qiáng)大,到目前為止,gdb已能夠支持Moduls-2、Chill、Pascal和FORTRAN程序的調(diào)試,但是調(diào)試這些語(yǔ)言的源程序時(shí)有一些功能還不能使用。
gdb程序調(diào)試的對(duì)象是可執(zhí)行文件然而,并不是所有的可執(zhí)行文件都可以用gdb調(diào)試。如果要讓產(chǎn)生的可執(zhí)行文件可以用來(lái)調(diào)試,需在執(zhí)行g(shù)cc指令編譯程序時(shí),加上-g參數(shù),指定程序在編譯時(shí)包含調(diào)試信息。36特制分析GDB命令的基本使用和應(yīng)用1.gdb基本命令:gdbfilenamegdb支持很多的命令且能實(shí)現(xiàn)不同的功能。這些命令從簡(jiǎn)單的文件裝入到允許你檢查所調(diào)用的堆棧內(nèi)容的復(fù)雜命令,下面列出了在使用gdb調(diào)試時(shí)會(huì)用到的一些命令。37特制分析1)file命令:裝入想要調(diào)試的可執(zhí)行文件。2)cd命令:改變工作目錄。3)pwd命令:返回當(dāng)前工作日錄。4)run命令:執(zhí)行當(dāng)前被調(diào)試的程序。5)kill命令:停止正在調(diào)試的應(yīng)用程序。6)list命令:列出正在調(diào)試的應(yīng)用程序的源代碼。7)break命令:設(shè)置斷點(diǎn)。8)Tbreak命令;設(shè)置臨時(shí)斷點(diǎn)。它的語(yǔ)法與break相同。區(qū)別在于用tbreak設(shè)置的斷點(diǎn)執(zhí)行一次之后立即消失。9)watch命令:設(shè)置監(jiān)視點(diǎn),監(jiān)視表達(dá)式的變化。10)awatch命令:設(shè)置讀寫(xiě)監(jiān)視點(diǎn)。當(dāng)要監(jiān)視的表達(dá)式被讀或?qū)憰r(shí)將應(yīng)用程序掛起。它的語(yǔ)法與watch命令相同。11)rwatch命令:設(shè)置讀監(jiān)視點(diǎn),當(dāng)監(jiān)視表達(dá)式被讀時(shí)將程序掛起,等侍調(diào)試。此命令的語(yǔ)法與watch相同。12)next命令:執(zhí)行下一條源代碼,但是不進(jìn)入函數(shù)內(nèi)部。也就是說(shuō),將一條函數(shù)調(diào)用作為一條語(yǔ)句執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng)run,開(kāi)始了代碼的執(zhí)行。13)step命令:執(zhí)行下一條源代碼,進(jìn)入函數(shù)內(nèi)部。如果調(diào)用了某個(gè)函數(shù),會(huì)跳到函數(shù)所在的代碼中等候一步步執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng)用run開(kāi)始執(zhí)行代碼。14)display命令:在應(yīng)用程序每次停止運(yùn)行時(shí)顯示表達(dá)式的值。15)infobreak命令:顯示當(dāng)前斷點(diǎn)列表,包括每個(gè)斷點(diǎn)到達(dá)的次數(shù)。16)infofiles命令:顯示調(diào)試文件的信息。17)infofunc命令:顯示所有的函數(shù)名。18)infolocal命令:顯示當(dāng)前函數(shù)的所有局部變量的信息。19)infoprog命令:顯示調(diào)試程序的執(zhí)行狀態(tài)。20)print命令;顯示表達(dá)式的值。21)delete命令:刪除斷點(diǎn)。指定一個(gè)斷點(diǎn)號(hào)碼,則刪除指定斷點(diǎn)。不指定參數(shù)則刪除所有的斷點(diǎn)。22)Shell命令:執(zhí)行LinuxShell命令。23)make命令:不退出gdb而重新編譯生成可執(zhí)行文件。24)Quit命令:退出gdb。LINUXshell編程變量特殊字符條件判斷結(jié)構(gòu)與循環(huán)結(jié)構(gòu)函數(shù)的定義和使用44特制分析Shell是一個(gè)作為用戶(hù)與LINUX系統(tǒng)間接口的程序,它允許用戶(hù)向操作系統(tǒng)輸入需要執(zhí)行的命令。shell編程語(yǔ)言如BASH、SH、TCSH、GAWK、Perl、Tcl和Tk都利用自己的解釋器。用這些語(yǔ)言編制的文件,可以直接運(yùn)行。編譯器則不同,它將生成一個(gè)獨(dú)立的二進(jìn)制代碼文件然后才可以運(yùn)行。45特制分析變量用戶(hù)變量環(huán)境變量位置變量預(yù)定義變量46特制分析用戶(hù)變量的定義及其使用與所有的編程語(yǔ)言一樣,shell也允許把值存在變量中,shell變量名以字母或下劃線字符開(kāi)始,由字母、數(shù)字或下劃線組成要把值存入變量,只要寫(xiě)出變量名,或緊跟一個(gè)=,再加變量值即可例如:variable=valuecount=1在程序中使用變量的值時(shí),要在變量名前面加上一個(gè)符號(hào)“$”。這個(gè)符號(hào)告訴Shell,要讀取該變量的值。例如:echo$variable47特制分析環(huán)境變量環(huán)境變量是一種特殊的變量,其特點(diǎn)為:它們可以由其他程序傳遞給腳本在腳本中被調(diào)用的任何程序都將繼承環(huán)境變量可以像定義一個(gè)變量一樣來(lái)設(shè)置環(huán)境變量,在標(biāo)記它為環(huán)境變量時(shí)需要使用“
export”命令應(yīng)用示例:
$exportMYENV=1 $echo$MYENV使用“
set”命令可以獲取當(dāng)前上下文中全部的變量
48特制分析位置參數(shù)執(zhí)行Shell腳本時(shí)可以使用參數(shù)。由出現(xiàn)命令行上的位置確定的參數(shù)稱(chēng)做位置參數(shù)。在sh中總共有十個(gè)位置參數(shù),其對(duì)應(yīng)的名稱(chēng)依次是$0,$1,$2,...$9。其中$0始終表示命令名或Shell腳本名,對(duì)于一個(gè)命令行,必然有命令名,也就必定有$0;而其它位置參數(shù)依據(jù)實(shí)際需求,可有可無(wú)。應(yīng)用示例:編輯ison文件內(nèi)容如下who|grep$1
執(zhí)行:$chmod+xison $./isonbcshell將用bc代替$1,命令行變?yōu)椋簑ho|grepbc
49特制分析shift命令shift命令的作用是把位置參數(shù)左移原來(lái)在$2中的內(nèi)容賦給$1,$3中內(nèi)容賦給$2,依此類(lèi)推。原來(lái)$1中的值就丟失了。$#(參數(shù)變量的個(gè)數(shù))也自動(dòng)減1
50特制分析shift命令(二)編輯shiftdemo程序如下:
echo$#$*shiftecho$#$*shiftecho$#$*shiftecho$#$*
執(zhí)行:chmod+xshiftdemo ./shiftdemoabc51特制分析預(yù)定義變量$#變量用于存放命令行中所鍵入的參數(shù)個(gè)數(shù)shell程序測(cè)試這個(gè)變量確定用戶(hù)輸入的參數(shù)個(gè)數(shù)是否正確應(yīng)用示例:編輯args文件內(nèi)容如下:
echo$#argumentspassedechoarg1=:$1:arg2=:$2:arg3=:$3:
執(zhí)行:$argsabc$argsab$args從這個(gè)例子可以看到shell程序?qū)⒚钚械膮?shù)個(gè)數(shù)傳遞給了$#變量
52特制分析預(yù)定義變量$*變量可以引用傳遞給程序的所有參數(shù)經(jīng)常應(yīng)用在參數(shù)不確定或者參數(shù)數(shù)目可變的程序中應(yīng)用示例:編輯args2文件內(nèi)容如下:
echo$#argumentspassedechotheyare$*
執(zhí)行:$chmod+xargs2 $arg2abc $arg2ab$arg2
53特制分析預(yù)定義變量$@變量$@變量和$*變量功能基本相同改寫(xiě)args2程序如下:
echo$#argumentspassedechotheyare$@54特制分析預(yù)定義變量 $?變量每當(dāng)程序執(zhí)行完成后都會(huì)給系統(tǒng)返回一個(gè)退出狀態(tài)。該狀態(tài)是個(gè)數(shù)值,通常指示該命令運(yùn)行是否成功。退出狀態(tài)為0表示運(yùn)行成功,非零表示運(yùn)行失敗。Shell自動(dòng)將最后所執(zhí)行命令的退出狀態(tài)設(shè)置到shell變量$?中,可以用echo命令在終端上顯示它的值應(yīng)用示例
$who|grepbc $echo$? $who|grep123 $echo$?
55特制分析特殊字符
通配符通常的通配符有三種:*星號(hào),它匹配任意字符的0次或多次出現(xiàn)。但注意,文件名前面的圓點(diǎn)(.)和路徑名中的斜線(/)必須顯示匹配。?問(wèn)號(hào),它匹配任意一個(gè)字符。[]一對(duì)方括號(hào),其中有一個(gè)字符組。其作用是匹配該字符組所限定的任意一個(gè)字符。應(yīng)該注意:字符*和?在一對(duì)方括號(hào)外面是通配符,若出現(xiàn)在其內(nèi)部,它們就失去通配符的能力了。!嘆號(hào),若它緊跟在一對(duì)方括號(hào)的左方括號(hào)[之
后,則表示不在一對(duì)方括號(hào)中所列出的字符。
56特制分析特殊字符
引號(hào)雙引號(hào)”
”
由雙引號(hào)括起來(lái)的字符,除$、倒引號(hào)和反斜線(\)仍保留其功能外,其余字符通常作為普通字符對(duì)待。單引號(hào)‘
’
由單引號(hào)括起來(lái)的字符都作為普通字符出現(xiàn)。倒引號(hào)``
反引號(hào)用于設(shè)置系統(tǒng)命令的輸出到變量。shell將反引號(hào)中的內(nèi)容作為一個(gè)系統(tǒng)命令,并執(zhí)行其內(nèi)容。反斜線
轉(zhuǎn)義字符,若想在字符串中使用反斜線本身,則必須采用(\\)的形式,其中第一個(gè)反斜線作為轉(zhuǎn)義字符,而把第二個(gè)反斜線變?yōu)槠胀ㄗ址?7特制分析條件判斷條件判斷語(yǔ)句是幾乎所有編程語(yǔ)言中都有的語(yǔ)句,shell中有兩種條件判斷語(yǔ)句:if表達(dá)式case表達(dá)式
58特制分析if表達(dá)式一般結(jié)構(gòu)
ifconmmand1 then elifcommand2 then else … fi
這個(gè)if…then…else表達(dá)式中的else和elif是可選部分。其中elif是elseif得縮寫(xiě),在if…then…else表達(dá)式中這樣的elseif語(yǔ)句可以有多個(gè)。其中fi表示if…then…else表達(dá)式的結(jié)束。Bash支持此類(lèi)表達(dá)式的多層嵌套。其中command1需要執(zhí)行并檢測(cè)其退出狀態(tài),如果退出狀態(tài)為0,則執(zhí)行其后then與elif之間的語(yǔ)句,同理執(zhí)行并檢測(cè)command2的退出狀態(tài),并根據(jù)退出狀態(tài)是否為0選擇執(zhí)行elif與else之間或else與fi之間的語(yǔ)句59特制分析test命令shell有一條內(nèi)部命令test,經(jīng)常用來(lái)在if命令中測(cè)試一種或幾種條件,其一般格式為:
testexpression其中expression表示要測(cè)試的條件。test計(jì)算expression,若結(jié)果為真,其返回的退出狀態(tài)為0,若結(jié)果為假,返回的退出狀態(tài)就不為零應(yīng)用示例:
$name=bc $test“$name”=bc $echo$?※注意:test把所有操作數(shù)($name和bc)和操作符作為單獨(dú)的參數(shù)分別對(duì)待,也就是說(shuō)它們之間至少要有一個(gè)空白字符分隔
60特制分析test命令(二)test命令的另一種格式shell程序使用test命令非常頻繁,因此產(chǎn)生了另一種公認(rèn)的命令格式:
[expression]“[”實(shí)際上就是命令的名字,同時(shí)要求在表達(dá)式的有一個(gè)配對(duì)的“]”,在“[“之后和”]”之前都要有空格應(yīng)用示例:
$name=bc $[“$name”=bc] $echo$?
61特制分析test命令(三)整數(shù)操作符test命令還有一類(lèi)進(jìn)行整數(shù)比較的操作符,見(jiàn)右表:例如:操作符“-eq”檢測(cè)兩個(gè)整數(shù)是否相等,如果有一個(gè)變量名為count,想看看它的值是否為0,則可以寫(xiě)成:[“$count”
–eq0]操作符返回真(退出狀態(tài)為0)的條件int1–eqint2int1等于int2int1–geint2int1大于或等于int2int1–gtint2int1大于int2int1–leint2int1小于或等于int2int1–ltint2int1小于int2int1–neint2int1不等于int262特制分析test命令(四)文件操作符test提供了一類(lèi)問(wèn)詢(xún)文件狀態(tài)的一元操作符,見(jiàn)右表:例如:[-f/etc/fstab]檢測(cè)fstab文件是否存在且是否為普通文件
63特制分析if結(jié)構(gòu)應(yīng)用示例使用if…then…else結(jié)構(gòu)編寫(xiě)一個(gè)判斷命令行所傳入?yún)?shù)大小的程序?qū)⑺斎霐?shù)值存放在位置參數(shù)$1中若$1>100,則輸出:thenumberisgreaterthan100若$1<10,則輸出:thenumberissmallerthan10否則輸出:thenumberisbetween10and100
64特制分析if表達(dá)式應(yīng)用示例(二)編輯ifdemo程序如下if["$1"-gt100]thenecho"thenumberisgreaterthan100."elif["$1"-lt10]thenecho"thenumberissmallerthan10."elseecho"thenumberisbetween10and100."fi執(zhí)行$chmod+xifdemo$./ifdemo100…
輸入數(shù)據(jù)測(cè)試程序功能
65特制分析case表達(dá)式case表達(dá)式類(lèi)似于C語(yǔ)言中的case語(yǔ)句和switch語(yǔ)句,即從幾種情況中選擇一種執(zhí)行。一般結(jié)構(gòu)
casestringinstring1)
…;;string2)
…;;*)
…;;esac66特制分析case表達(dá)式(二)關(guān)鍵字是case、in、雙分號(hào)和esac。字符串string首先與string1和string2比較,如果匹配就執(zhí)行它們下面的語(yǔ)句直到雙分號(hào)。如果字符串string與列出的字符串都不匹配,則執(zhí)行*)下面的語(yǔ)句
67特制分析case表達(dá)式(三)應(yīng)用示例:編寫(xiě)一個(gè)實(shí)現(xiàn)中英文數(shù)字轉(zhuǎn)換的程序,編輯casedemo程序如下:if["$#"-ne1]thenecho"usage:./casedemonumber"exit1ficase"$1"in0)echozero;;1)echoone;;2)echotwo;;
………………8)echoeight;;9)echonine;;esac68特制分析循環(huán)shell中提供了可供靈活處理循環(huán)的語(yǔ)句,這些循環(huán)可以重復(fù)執(zhí)行一組命令,既可以是事先指定的次數(shù),也可以是直到某種條件滿(mǎn)足為止。shell中有三個(gè)內(nèi)部循環(huán)命令:forwhile{…}until
69特制分析for命令for命令用來(lái)將一組命令循環(huán)執(zhí)行預(yù)先確定的次數(shù)基本格式:forvarinword1word2…wordndo command done應(yīng)用示例:
$foriin123>do>echo$i>done可以看到終端上依次輸出1、2、3
70特制分析不帶列表的for命令for命令也可以寫(xiě)成以下形式:forvardo commanddoneshell也能認(rèn)出這種少了in的特殊格式,shell會(huì)自動(dòng)將命令行鍵入的所有參數(shù)依次組織成列表。應(yīng)用示例:編輯fordemo文件內(nèi)容如下:
echoNumberofargumentspassedis$# forargdoecho$argdone執(zhí)行:$chmod+xfordemo$./fordemoabc
71特制分析while命令第二種循環(huán)命令是while,格式為:whilecommand1do commanddone先執(zhí)行command1,并檢測(cè)其退出狀態(tài),如果為0則執(zhí)行do與done之間命令,再次檢測(cè)直到command1退出狀態(tài)不為0如果第一次執(zhí)行command1時(shí)退出狀態(tài)就不為0,那么do和done之間的命令可能根本不執(zhí)行72特制分析while命令應(yīng)用示例while循環(huán)通常跟shift命令結(jié)合使用,以處理命令行中鍵入的參數(shù)個(gè)數(shù)可變的情況編寫(xiě)whiledemo程序如下:
while[“$#”-ne0]do echo“$1” shiftdone執(zhí)行:$chmod+xwhiledemo $./whiledemoabcshift命令使位置變量向下移($2到$1,$3到$2),
并且$#遞減。73特制分析until命令until命令跟while很像,區(qū)別在于只要在until后面的命令退出狀態(tài)不為0,循環(huán)就一直執(zhí)行下去,其格式為:
untilcommand1 do command done跟while命令一樣,如果第一次執(zhí)行command1時(shí)返回的退出狀態(tài)為0,do和done之間的命令可能跟本不會(huì)執(zhí)行。
74特制分析until命令示例程序編輯untildemo程序如下:
if["$#"-ne1]thenecho"Usage:untildemouser"exit1fiuntilwho|grep"$1">/dev/nulldosleep10doneecho"$1hasloggedon"執(zhí)行:$chmod+xuntildemo $./untildemobc $./untildemo123結(jié)束進(jìn)程:ctrl+C75特制分析break命令與continue命令break命令與continue命令與C中相應(yīng)命令功能相同break命令只退出循環(huán)而不退出程序continue命令不退出循環(huán),只跳過(guò)循環(huán)體后面的命令,而后循環(huán)像正常情況一樣繼續(xù)執(zhí)行
76特制分析函數(shù)的定義和調(diào)用和"真正的"編程語(yǔ)言一樣,Bash也有函數(shù),雖然在某些實(shí)現(xiàn)方面稍有些限制.一個(gè)函數(shù)是一個(gè)子程序,用于實(shí)現(xiàn)一串操作的代碼塊(codeblock),它是完成特定任務(wù)的"黑盒子".當(dāng)有重復(fù)代碼,當(dāng)一個(gè)任務(wù)只需要很少的修改就被重復(fù)幾次執(zhí)行時(shí),這時(shí)你應(yīng)考慮使用函數(shù).其定義格式如下:
funcname()
{
command
...
command
}函數(shù)被調(diào)用或被觸發(fā),只需要簡(jiǎn)單地用函數(shù)名調(diào)用.77特制分析簡(jiǎn)單函數(shù)的例子
#!/bin/bashfun(){if[-z"$1"]#第一個(gè)參數(shù)是否長(zhǎng)度為零?thenecho"-Parameter#1iszerolength.-"#則沒(méi)有參數(shù)傳遞進(jìn)來(lái).elseecho"-Param#1is\"$1\".-"fi}funfun“hello”78特制分析綜合實(shí)驗(yàn)一:清除log文件
cleanlog.sh版本1
在一個(gè)最簡(jiǎn)單的例子中,一個(gè)shell腳本其實(shí)就是將一堆系統(tǒng)命令列在一個(gè)文件中。好處就是把所有命令都放在一個(gè)腳本中,不用每次都敲它們.這樣,對(duì)于特定的應(yīng)用來(lái)說(shuō),這個(gè)腳本就很容易被修改或定制。在這次練習(xí)中,我們編寫(xiě)一個(gè)最簡(jiǎn)單的腳本,其內(nèi)容是清除/var/log/message和/var/log/wtmp中的內(nèi)容,如下。
cd/var/log
cat/dev/null>messages
cat/dev/null>wtmp
echo"Logscleanedup."79特制分析綜合實(shí)驗(yàn)一:清除log文件
cleanlog.sh版本2下面按照Shell編程的一些規(guī)則進(jìn)行改良:在第一行添加一個(gè)Bash腳本的正確的開(kāi)頭部分,指定解釋器為bash。使用變量指定/var/log目錄,在后面使用這個(gè)變量。最后用exit正常退出。使用注釋說(shuō)明各部分的用法。80特制分析綜合實(shí)驗(yàn)一:清除log文件#!/bin/bash#一個(gè)Bash腳本的正確的開(kāi)頭部分.#要使用root身份來(lái)運(yùn)行.#在此處插入代碼,來(lái)打印錯(cuò)誤消息,并且在不是root身份的時(shí)候退出.LOG_DIR=/var/log#使用變量比把代碼寫(xiě)死的好.cd$LOG_DIRcat/dev/null>messagescat/dev/null>wtmpecho"Logscleanedup.“exit#這個(gè)命令是一種正確并且合適的退出腳本的方法.81特制分析綜合實(shí)驗(yàn)一:清除log文件cleanlog.sh版本3
現(xiàn)在,讓我們來(lái)編寫(xiě)有真正意義的腳本:添加權(quán)限有關(guān)語(yǔ)句,判斷執(zhí)行腳本的是否根用戶(hù),如果不是則輸出出錯(cuò)信息,退出。添加語(yǔ)句,判斷是否有命令行參數(shù),如果有,假設(shè)是n,在后面的清除log的時(shí)候保留最后的n行;如果沒(méi)有,設(shè)n=50。你可以不斷地找到新的方法來(lái)完善這個(gè)腳本,并提高效率。82特制分析綜合實(shí)驗(yàn)一:清除log
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇歷屆考編試題及答案
- 單詞認(rèn)讀測(cè)試題及答案
- 確保設(shè)計(jì)成果一致性的國(guó)際商業(yè)美術(shù)設(shè)計(jì)師考試實(shí)施方案與試題及答案
- 2024年助理廣告師考試信息獲取技巧試題及答案
- 對(duì)應(yīng)課本測(cè)試題及答案
- 2024年助理廣告師考試知識(shí)應(yīng)用分析試題及答案
- 助理廣告師考試中的創(chuàng)意思考與活動(dòng)設(shè)計(jì)試題及答案
- 專(zhuān)科工程地質(zhì)試題及答案
- 如何提高紡織品檢驗(yàn)的效率與準(zhǔn)確性試題及答案
- 江門(mén)中考英語(yǔ)試題及答案
- 全國(guó)各省市郵編對(duì)照表
- 行政區(qū)域代碼表Excel
- 《試種一粒籽》第1課時(shí)示范課教學(xué)設(shè)計(jì)【部編人教版二年級(jí)道德與法治下冊(cè)】
- YS/T 837-2012濺射靶材-背板結(jié)合質(zhì)量超聲波檢驗(yàn)方法
- 燒烤類(lèi)菜單表格
- DB11∕T 583-2022 扣件式和碗扣式鋼管腳手架安全選用技術(shù)規(guī)程
- 酒水購(gòu)銷(xiāo)合同范本(3篇)
- 海康威視系統(tǒng)圖標(biāo)
- 印染廠管理手冊(cè)
- 保潔服務(wù)崗位檢查考核評(píng)分標(biāo)準(zhǔn)
- 《字體與版式設(shè)計(jì)》教學(xué)課件(全)
評(píng)論
0/150
提交評(píng)論