linux程序設(shè)計(jì)基礎(chǔ)PPT課件_第1頁
linux程序設(shè)計(jì)基礎(chǔ)PPT課件_第2頁
linux程序設(shè)計(jì)基礎(chǔ)PPT課件_第3頁
linux程序設(shè)計(jì)基礎(chǔ)PPT課件_第4頁
linux程序設(shè)計(jì)基礎(chǔ)PPT課件_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第二章 Linux 程序設(shè)計(jì)基礎(chǔ),本章學(xué)習(xí)目標(biāo),通過對(duì)本章的學(xué)習(xí),讀者應(yīng)該掌握以下主要內(nèi)容:,Linux編程風(fēng)格 Linux下使用GNU cc開發(fā)應(yīng)用程序 Linux程序的調(diào)試,1.概述,1.1 Linux應(yīng)用軟件開發(fā):,Linux開發(fā)具有活躍的開發(fā)環(huán)境,Linux開發(fā)工作一般是由多個(gè)Linux用戶共同完成一個(gè)項(xiàng)目的。開發(fā)工作完成后,該軟件就被放到Internet站點(diǎn)上,任何用戶都可以訪問和下載它。 大多數(shù)Linux軟件是經(jīng)過自由軟件基金會(huì)提供的GNU公開認(rèn)證授權(quán)的,因而通常被稱作GNU軟件。 GNU軟件免費(fèi)提供給用戶使用,并被證明是非常可靠和高效的。,Linux 程序設(shè)計(jì)基礎(chǔ),1、Linux

2、下c程序開發(fā),2、Linux下的 shell 編程,.,4,Linux下的C語言,C語言是一門“中級(jí)語言”,是匯編語言和高級(jí)語言過渡的一種語言,但是它既具有高級(jí)語言簡單易懂、靈活方便的特點(diǎn),同時(shí),他又具有匯編語言的執(zhí)行高效和可對(duì)硬件直接操作的特點(diǎn)。,C語言的應(yīng)用,進(jìn)行底層的開發(fā): 如內(nèi)核開發(fā)及基于linux的嵌入式開發(fā)。,進(jìn)行頂層的開發(fā): 如linux下的應(yīng)用程序的開發(fā),一個(gè)完整的開發(fā)工具應(yīng)該包括:,編輯工具:vi編輯器,編譯工具:gcc,調(diào)試工具: gdb,配置、項(xiàng)目管理工具,2.1 Linux下 c 程序開發(fā),函數(shù)庫及系統(tǒng)頭文件:,集成開發(fā)環(huán)境IDE,Kylix Kdevelop RHID

3、E,Linux 安裝時(shí)完成了這些,Linux下 c 程序的開發(fā)過程:,使用vi等編輯工具編寫源程序 保存為*.c 使用gcc編譯成二進(jìn)制可執(zhí)行文件 ./文件名 執(zhí)行 有問題可以用gdb進(jìn)行調(diào)試,一、編輯工具:,在Linux下編程,你不再擁有集成化環(huán)境,你可以使用類似于記事本的工具-經(jīng)典的vi來編輯源程序。當(dāng)然,還有更高檔一些的,如joe、emacs等??傊?,編輯程序與編譯工作是分開的。 vi編輯器有三種工作模式:,命令行模式,插入模式,底行模式,編輯 hello.c,1)命令行模式:,用戶在用vi編輯文件時(shí),最初進(jìn)入的一般模式,此時(shí)鍵盤輸入當(dāng)做命令。在該模式中可以進(jìn)行光標(biāo)移動(dòng)、刪除、復(fù)制、粘貼

4、等操作,但是無法編輯文字。,光標(biāo)命令,編輯命令,2)插入模式:,在該模式下,vi編輯器進(jìn)入編輯狀態(tài):,狀態(tài)命令,3)末行模式:,在該模式下,vi編輯器實(shí)現(xiàn)文件的保存和退出。,2、編譯工具:gcc,gcc是gnu推出的功能強(qiáng)大性能優(yōu)越的多平臺(tái)編譯器,gcc能將c、c+、Fottran等語言源文件進(jìn)行編譯、連接生成可執(zhí)行文件。gcc支持下面后綴名的文件:,.c c語言源文件 .h c語言頭文件 .i 已經(jīng)預(yù)處理的源文件 .o 編譯后的目標(biāo)文件 .s 匯編語言源代碼文件,gcc v 查詢gcc的版本號(hào),Gcc編譯過程 :,預(yù)處理,鏈接,匯編,組譯,源程序(*.c),可執(zhí)行文件 ELF格式,預(yù)處理器,

5、匯編器,組譯器,連接器,.o目標(biāo)文件,gcc的使用格式如下:,gcc options filenames,當(dāng)使用gcc時(shí),gcc會(huì)完成預(yù)處理、編譯、匯編和連接。前三步生成目標(biāo)文件,連接時(shí),把生成的目標(biāo)文件鏈接成可執(zhí)行文件。gcc可以針對(duì)支持不同的源程序文件進(jìn)行不同處理,文件格式以文件的后綴來識(shí)別。,gcc -o 目標(biāo)文件名 源文件名(.c形式的文件) 如 gcc o hello hello.c ./可執(zhí)行文件名 進(jìn)行執(zhí)行文件,gcc o test.o c test.c gcc c test.c 僅把源代碼編譯為目標(biāo)代碼而跳過連接,優(yōu)點(diǎn):當(dāng)編譯多個(gè)c程序時(shí)速度更快,易于管理。,gcc WALL

6、o test test1.c test2.c test3.c 有多個(gè)源文件生成 test,不產(chǎn)生警告信息,gcc c test.c -o test.o,gcc g o hello hello.c 編譯生成可執(zhí)行連接文件hello同時(shí)生成供調(diào)試的信息。,使用優(yōu)化選項(xiàng),當(dāng)用gcc編譯C代碼時(shí),它會(huì)試著用最少的時(shí)間完成編譯并且使編譯后的代碼易于調(diào)試. 易于調(diào)試意味著編譯后的代碼與源代碼有同樣的執(zhí)行次序,編譯后的代碼沒有經(jīng)過優(yōu)化。有很多選項(xiàng)可用于告訴gcc,在耗費(fèi)更多編譯時(shí)間和犧牲易調(diào)試性的基礎(chǔ)上,產(chǎn)生更小更快的可執(zhí)行文件。這些選項(xiàng)中最典型的是-O和-O2選項(xiàng)。,-O選項(xiàng)告訴gcc對(duì)源代碼進(jìn)行基本優(yōu)化

7、。這些優(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í)行文件。,GNU make 管理項(xiàng)目,1、包含多個(gè)源文件的項(xiàng)目在編譯時(shí)都有長而復(fù)雜的命令行,每次都分別編譯鏈該項(xiàng)目,比較麻煩。,2、當(dāng)某一個(gè)源文件被修改以后,則必須重新編譯和鏈接,最后生成可執(zhí)行文件。,a.c b.c e.c f.c Makefile,a 項(xiàng)目目錄,# make,有了Makefile文件,我們只用一個(gè)make命令就可

8、以自動(dòng)智能地根據(jù)當(dāng)前的文件修改的情況編譯所需要的文件和鏈接目標(biāo)程序。,在執(zhí)行make指令時(shí)makefile的默認(rèn)文件名為GNUmakefile、makefile或Makefile,當(dāng)然也可以在make的命令行中指定別的文件名。,一、make的執(zhí)行:,#make f makefilename,#make target(目標(biāo)文件),Makefile的文件的基本結(jié)構(gòu): 1、makefile 是一個(gè)文本形式的數(shù)據(jù)庫文件,其中包含了一些規(guī)則告訴make處理哪些文件以及怎么處理這些文件。 2、這些規(guī)則主要描述一些target目標(biāo)文件是從哪些依賴文件產(chǎn)生的,以及用什么命令來執(zhí)行該過程。依靠這些規(guī)則,make

9、會(huì)對(duì)磁盤上的文件進(jìn)行檢查時(shí)間差,以便更新目標(biāo)文件。 3、目標(biāo)文件不一定是最后的可執(zhí)行文件,可以是任何中間文件,并可以做為其他目標(biāo)文件的依賴文件。,# 一個(gè)簡單的Makefile的例子(以#開頭的為注釋行) test:prog.o code.o gcc o test prog.o code.o prog.o:prog.c prog.h code.h gcc c prog.c o prog.o code.o:code.c code.h gcc c code.c o code.o clean: rm f *.o,#make #make Makefile #make test,命令行以tab鍵開始,偽

10、目標(biāo): #make clean,例如 :用make編譯hello.c 單一文件,.,25,對(duì)于一個(gè)有很多源文件的項(xiàng)目,當(dāng)改變一個(gè)頭文件的時(shí)候,由于所有的依賴關(guān)系都在Makefile里,因此不再需要記住依賴此頭文件的所有源碼文件,make可以自動(dòng)的重新編譯所有那些因依賴這個(gè)頭文件而改變了的源碼文件,如果需要,再進(jìn)行重新連接。,Makefile文件的簡化:,1、利用Makefile中的自定義變量:,Makefile里的變量就像一個(gè)環(huán)境變量。事實(shí)上,環(huán)境變量在make中也被解釋成make的變量。這些變量對(duì)大小寫敏感,一般使用大寫宇母。幾乎可以從任何地方引用定義的變量,變量的主要作用如下:,a、保存文

11、件名列表,b、保存可執(zhí)行命令名,c、保存編譯器的參數(shù),變量引用: $VARNAME,make解釋規(guī)則時(shí),VARNAME在等式右端展開為定義它的字符串。變量一般都在Makefile的頭部定義。按照慣例,所有的Makefile變量都應(yīng)該是大寫。如果變量的值發(fā)生變化,就只需要在一個(gè)地方修改,從而簡化了Makefile的維護(hù)。,現(xiàn)在利用變量把前面的Makefile重寫一遍: OBJS=prog.o code.o CC=gcc test:$ OBJS $ CC o test $ OBJS prog.o:prog.c prog.h code.h $ CC c prog.c o prog.o code.o:

12、code.c code.h $ CC c code.c o code.o clean: rm f *.o,2、利用Makefile中的其它變量:,一個(gè)C編譯的具體命令將會(huì)是: $ CC $ CFLAGS $ CPPFLAGSc $ -o $,CFLAGS: c編譯器的選項(xiàng) CPP: c預(yù)編譯器的名稱默認(rèn)值為¥cc -E CPPFLAGS: c預(yù)編譯的選項(xiàng) TARGET_ARCH: 目標(biāo)機(jī)器的結(jié)構(gòu)定義,預(yù)定義變量,如:源程序?yàn)?經(jīng)過變量替換過后的makefile文件:,3、利用Makefile中的隱含規(guī)則:,現(xiàn)在利用變量把前面的Makefile重寫一遍: OBJS=prog.o code.o C

13、C=gcc test:$ OBJS $ CC o $ $ prog.o:prog.c prog.h code.h code.o:code.c code.h clean: rm f *.o,使用automake和autoconf產(chǎn)生Makefile,在開始使用Automake和autoconf之前,請(qǐng)先確認(rèn)系統(tǒng)已經(jīng)安裝以下的軟件: GNU Automake GNU Autoconf GNU m4 Perl GNU Libtool (如果你需要產(chǎn)生 shared library),完成實(shí)驗(yàn)內(nèi)容,三、調(diào)試工具GDB:,Linux系統(tǒng)中包含了GNU 調(diào)試程序gdb,它是一個(gè)用來調(diào)試C和 C+ 程序的調(diào)

14、試器??梢允钩绦蜷_發(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)。,gdb的功能非常強(qiáng)大,到目前為止,gdb已能夠支持Moduls-2、Chill、Pascal和FORTRAN程序的調(diào)試,但是調(diào)試這些語言的源程序時(shí)有一些功能還不能使用。 gdb程序調(diào)試的對(duì)象是可執(zhí)行文件然而,并不是所有的可執(zhí)行文件都可以用gdb調(diào)試。如果

15、要讓產(chǎn)生的可執(zhí)行文件可以用來調(diào)試,需在執(zhí)行g(shù)cc指令編譯程序時(shí),加上-g參數(shù),指定程序在編譯時(shí)包含調(diào)試信息。,GDB命令的基本使用和應(yīng)用,1gdb基本命令:,gdb filename,gdb支持很多的命令且能實(shí)現(xiàn)不同的功能。這些命令從簡單的文件裝入到允許你檢查所調(diào)用的堆棧內(nèi)容的復(fù)雜命令, 下面列出了在使用gdb 調(diào)試時(shí)會(huì)用到的一些命令。,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)brea

16、k命令:設(shè)置斷點(diǎn)。,8)Tbreak命令;設(shè)置臨時(shí)斷點(diǎn)。它的語法與break相同。區(qū)別在于用tbreak設(shè)置的斷點(diǎn)執(zhí)行一次之后立即消失。 9)watch命令:設(shè)置監(jiān)視點(diǎn),監(jiān)視表達(dá)式的變化。 10)awatch命令:設(shè)置讀寫監(jiān)視點(diǎn)。當(dāng)要監(jiān)視的表達(dá)式被讀或?qū)憰r(shí)將應(yīng)用程序掛起。它的語法與watch命令相同。 11)rwatch命令:設(shè)置讀監(jiān)視點(diǎn),當(dāng)監(jiān)視表達(dá)式被讀時(shí)將程序掛起,等侍調(diào)試。此命令的語法與watch相同。 12)next命令:執(zhí)行下一條源代碼,但是不進(jìn)入函數(shù)內(nèi)部。也就是說,將一條函數(shù)調(diào)用作為一條語句執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng)run,開始了代碼的執(zhí)行。,13)step命令:執(zhí)行下一條源代

17、碼,進(jìn)入函數(shù)內(nèi)部。如果調(diào)用了某個(gè)函數(shù),會(huì)跳到函數(shù)所在的代碼中等候一步步執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng)用run開始執(zhí)行代碼。 14)display命令:在應(yīng)用程序每次停止運(yùn)行時(shí)顯示表達(dá)式的值。 15)info break命令:顯示當(dāng)前斷點(diǎn)列表,包括每個(gè)斷點(diǎn)到達(dá)的次數(shù)。 16)info files命令:顯示調(diào)試文件的信息。 17)info func命令:顯示所有的函數(shù)名。 18)info local命令:顯示當(dāng)前函數(shù)的所有局部變量的信息。,19)info prog命令:顯示調(diào)試程序的執(zhí)行狀態(tài)。 20)print命令;顯示表達(dá)式的值。 21)delete命令:刪除斷點(diǎn)。指定一個(gè)斷點(diǎn)號(hào)碼,則刪除指定斷

18、點(diǎn)。不指定參數(shù)則刪除所有的斷點(diǎn)。 22)Shell命令:執(zhí)行Linux Shell命令。 23)make命令:不退出gdb而重新編譯生成可執(zhí)行文件。 24)Quit命令:退出gdb。,.,44,LINUX shell 編程,變量 特殊字符 條件判斷結(jié)構(gòu)與循環(huán)結(jié)構(gòu) 函數(shù)的定義和使用,.,45,Shell是一個(gè)作為用戶與LINUX系統(tǒng)間接口的程序,它允許用戶向操作系統(tǒng)輸入需要執(zhí)行的命令。,shell編程語言如BASH、SH、TCSH、GAWK、Perl、Tcl和Tk都利用自己的解釋器。用這些語言編制的文件,可以直接運(yùn)行。編譯器則不同,它將生成一個(gè)獨(dú)立的二進(jìn)制代碼文件然后才可以運(yùn)行。,.,46,變量

19、,用戶變量 環(huán)境變量 位置變量 預(yù)定義變量,.,47,用戶變量的定義及其使用,與所有的編程語言一樣,shell也允許把值存在變量中,shell變量名以字母或下劃線字符開始,由字母、數(shù)字或下劃線組成 要把值存入變量,只要寫出變量名,或緊跟一個(gè)=,再加變量值即可 例如:variable=value count=1 在程序中使用變量的值時(shí),要在變量名前面加上一個(gè)符號(hào)“$”。這個(gè)符號(hào)告訴Shell,要讀取該變量的值。 例如:echo $variable,.,48,環(huán)境變量,環(huán)境變量是一種特殊的變量,其特點(diǎn)為: 它們可以由其他程序傳遞給腳本 在腳本中被調(diào)用的任何程序都將繼承環(huán)境變量 可以像定義一個(gè)變量一

20、樣來設(shè)置環(huán)境變量,在標(biāo)記它為環(huán)境變量時(shí)需要使用“ export ”命令 應(yīng)用示例: $ export MYENV=1 $ echo $MYENV 使用“ set ”命令可以獲取當(dāng)前上下文中全部的變量,.,49,位置參數(shù),執(zhí)行Shell腳本時(shí)可以使用參數(shù)。由出現(xiàn)命令行上的位置確定的參數(shù)稱做位置參數(shù)。在sh中總共有十個(gè)位置參數(shù),其對(duì)應(yīng)的名稱依次是$0,$1,$2,.$9。其中$0始終表示命令名或Shell腳本名,對(duì)于一個(gè)命令行,必然有命令名,也就必定有$0;而其它位置參數(shù)依據(jù)實(shí)際需求,可有可無。 應(yīng)用示例:編輯ison文件內(nèi)容如下 who | grep $1 執(zhí)行:$ chmod +x ison

21、$ ./ison bc shell將用bc代替$1,命令行變?yōu)椋簑ho | grep bc,.,50,shift命令,shift命令的作用是把位置參數(shù)左移 原來在$2中的內(nèi)容賦給$1,$3中內(nèi)容賦給$2,依此類推。 原來$1中的值就丟失了。 $#(參數(shù)變量的個(gè)數(shù))也自動(dòng)減1,.,51,shift命令(二),編輯shiftdemo程序如下: echo $# $* shift echo $# $* shift echo $# $* shift echo $# $* 執(zhí)行: chmod +x shiftdemo ./ shiftdemo a b c,.,52,預(yù)定義變量,$# 變量 用于存放命令行中

22、所鍵入的參數(shù)個(gè)數(shù) shell程序測(cè)試這個(gè)變量確定用戶輸入的參數(shù)個(gè)數(shù)是否正確 應(yīng)用示例:編輯args文件內(nèi)容如下: echo $# arguments passed echo arg 1= :$1: arg 2 =:$2: arg 3 =:$3: 執(zhí)行: $ args a b c $ args a b $ args 從這個(gè)例子可以看到shell程序?qū)⒚钚械膮?shù)個(gè) 數(shù)傳遞給了$#變量,.,53,預(yù)定義變量,$* 變量 可以引用傳遞給程序的所有參數(shù) 經(jīng)常應(yīng)用在參數(shù)不確定或者參數(shù)數(shù)目可變的程序中 應(yīng)用示例:編輯args2文件內(nèi)容如下: echo $# arguments passed echo th

23、ey are $* 執(zhí)行 : $ chmod +x args2 $ arg2 a b c $ arg2 a b $ arg2,.,54,預(yù)定義變量,$變量 $變量和$*變量功能基本相同 改寫args2程序如下: echo $# arguments passed echo they are $,.,55,預(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 |

24、grep bc $ echo $? $ who | grep 123 $ echo $?,.,56,特殊字符,通配符 通常的通配符有三種: * 星號(hào),它匹配任意字符的0次或多次出現(xiàn)。但注意,文件名前面的圓點(diǎ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)中所列出的字符。,.,57,特殊字符,引號(hào) 雙引號(hào)” ” 由雙引號(hào)括起來的字符,

25、除$、倒引號(hào)和反斜線()仍保留其功能外,其余字符通常作為普通字符對(duì)待。 單引號(hào) 由單引號(hào)括起來的字符都作為普通字符出現(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)槠胀ㄗ址?.,58,條件判斷,條件判斷語句是幾乎所有編程語言中都有的語句,shell中有兩種條件判斷語句: if表達(dá)式 case表達(dá)式,.,59,if表達(dá)式,一般結(jié)構(gòu) if conmmand1 then elif command2 then else

26、 fi 這個(gè)ifthenelse表達(dá)式中的else和elif是可選部分。其中elif是else if得縮寫,在ifthenelse表達(dá)式中這樣的else if語句可以有多個(gè)。其中fi表示ifthenelse表達(dá)式的結(jié)束。Bash支持此類表達(dá)式的多層嵌套。 其中command1需要執(zhí)行并檢測(cè)其退出狀態(tài),如果退出狀態(tài)為0,則執(zhí)行其后then與elif之間的語句,同理執(zhí)行并檢測(cè)command2的退出狀態(tài),并根據(jù)退出狀態(tài)是否為0選擇執(zhí)行elif與else之間或else與fi之間的語句,.,60,test命令,shell有一條內(nèi)部命令test,經(jīng)常用來在if命令中測(cè)試一種或幾種條件,其一般格式為: te

27、st expression 其中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ì)待,也就是說它們之間至少要有一個(gè)空白字符分隔,.,61,test命令(二),test命令的另一種格式 shell程序使用test命令非常頻繁,因此產(chǎn)生了另一種公認(rèn)的命令格式: expression “”實(shí)際上就是命令的名字,同時(shí)要求在表達(dá)式的有一個(gè)配對(duì)的“”,

28、在 “之后和”之前都要有空格 應(yīng)用示例: $ name=bc $ “$name” = bc $ echo $?,.,62,test命令(三),整數(shù)操作符 test命令還有一類進(jìn)行整數(shù)比較的操作符,見右表: 例如:操作符“-eq”檢測(cè)兩個(gè)整數(shù)是否相等,如果有一個(gè)變量名為count,想看看它的值是否為0,則可以寫成: “$count” eq 0 ,.,63,test命令(四),文件操作符 test提供了一類問詢文件 狀態(tài)的一元操作符,見右表: 例如: -f /etc/fstab 檢測(cè)fstab文件是否存在且 是否為普通文件,.,64,if結(jié)構(gòu)應(yīng)用示例,使用ifthenelse結(jié)構(gòu)編寫一個(gè)判斷命令行

29、所傳入?yún)?shù)大小的程序 將所輸入數(shù)值存放在位置參數(shù)$1中 若$1100,則輸出:the number is greater than 100 若$1 do echo $i done 可以看到終端上依次輸出1、2、3,.,71,不帶列表的for命令,for命令也可以寫成以下形式: for var do command done shell也能認(rèn)出這種少了in的特殊格式,shell會(huì)自動(dòng)將命令行鍵入的所有參數(shù)依次組織成列表。 應(yīng)用示例: 編輯fordemo文件內(nèi)容如下: echo Number of arguments passed is $# for arg do echo $arg done 執(zhí)

30、行 : $ chmod +x fordemo $ ./fordemo a b c,.,72,while命令,第二種循環(huán)命令是while,格式為: while command1 do command done 先執(zhí)行command1,并檢測(cè)其退出狀態(tài),如果為0則執(zhí)行do與done之間命令,再次檢測(cè)直到command1退出狀態(tài)不為0 如果第一次執(zhí)行command1時(shí)退出狀態(tài)就不為0,那么do和done之間的命令可能根本不執(zhí)行,.,73,while命令應(yīng)用示例,while循環(huán)通常跟shift命令結(jié)合使用,以處理命令行中鍵入的參數(shù)個(gè)數(shù)可變的情況 編寫whiledemo程序如下: while “$#”

31、-ne 0 do echo “$1” shift done 執(zhí)行: $ chmod +x whiledemo $ ./whiledemo a b c shift命令使位置變量向下移($2到$1,$3到$2), 并且$#遞減。,.,74,until命令,until命令跟while很像,區(qū)別在于只要在until后面的命令退出狀態(tài)不為0,循環(huán)就一直執(zhí)行下去,其格式為: until command1 do command done 跟while命令一樣,如果第一次執(zhí)行command1時(shí)返回的退出狀態(tài)為0,do和done之間的命令可能 跟本不會(huì)執(zhí)行。,.,75,until命令示例程序,編輯untilde

32、mo程序如下: if $# -ne 1 then echo Usage:untildemo user exit 1 fi until who | grep $1 /dev/null do sleep 10 done echo $1 has logged on 執(zhí)行: $chmod +x untildemo $ ./untildemo bc $ ./untildemo 123 結(jié)束進(jìn)程:ctrl+C,.,76,break命令與continue命令,break命令與continue命令與C中相應(yīng)命令功能相同 break命令只退出循環(huán)而不退出程序 continue命令不退出循環(huán),只跳過循環(huán)體后面的命

33、令,而后循環(huán)像正常情況一樣繼續(xù)執(zhí)行,.,77,函數(shù)的定義和調(diào)用,和真正的編程語言一樣, Bash 也有函數(shù),雖然在某些實(shí)現(xiàn)方面稍有些限制. 一個(gè)函數(shù)是一個(gè)子程序,用于實(shí)現(xiàn)一串操作的代碼塊(code block),它是完成特定任務(wù)的黑盒子. 當(dāng)有重復(fù)代碼, 當(dāng)一個(gè)任務(wù)只需要很少的修改就被重復(fù)幾次執(zhí)行時(shí), 這時(shí)你應(yīng)考慮使用函數(shù). 其定義格式如下: funcname() command . command 函數(shù)被調(diào)用或被觸發(fā), 只需要簡單地用函數(shù)名調(diào)用.,.,78,簡單函數(shù)的例子,#!/bin/bash fun () if -z $1 # 第一個(gè)參數(shù)是否長度為零? then echo -Parame

34、ter #1 is zero length.- # 則沒有參數(shù)傳遞進(jìn)來. else echo -Param #1 is $1.- fi fun fun “hello”,.,79,綜合實(shí)驗(yàn)一:清除log 文件,cleanlog.sh版本1 在一個(gè)最簡單的例子中,一個(gè)shell 腳本其實(shí)就是將一堆系統(tǒng)命令列在一個(gè)文件中。好處就是把所有命令都放在一個(gè)腳本中,不用每次都敲它們.這樣,對(duì)于特定的應(yīng)用來說,這個(gè)腳本就很容易被修改或定制。 在這次練習(xí)中,我們編寫一個(gè)最簡單的腳本,其內(nèi)容是清除/var/log/message和/var/log/wtmp中的內(nèi)容,如下。 cd /var/log cat /dev

35、/null messages cat /dev/null wtmp echo Logs cleaned up.,.,80,綜合實(shí)驗(yàn)一:清除log 文件,cleanlog.sh版本2 下面按照Shell編程的一些規(guī)則進(jìn)行改良: 在第一行添加一個(gè)Bash 腳本的正確的開頭部分,指定解釋器為bash。 使用變量指定/var/log目錄,在后面使用這個(gè)變量。 最后用exit正常退出。 使用注釋說明各部分的用法。,.,81,綜合實(shí)驗(yàn)一:清除log 文件,#!/bin/bash # 一個(gè)Bash 腳本的正確的開頭部分. # 要使用root 身份來運(yùn)行. # 在此處插入代碼,來打印錯(cuò)誤消息,并且在不是roo

36、t 身份的時(shí)候退出. LOG_DIR=/var/log # 使用變量比把代碼寫死的好. cd $LOG_DIR cat /dev/null messages cat /dev/null wtmp echo Logs cleaned up.“ exit # 這個(gè)命令是一種正確并且合適的退出腳本的方法.,.,82,綜合實(shí)驗(yàn)一:清除log 文件,cleanlog.sh版本3 現(xiàn)在,讓我們來編寫有真正意義的腳本: 添加權(quán)限有關(guān)語句,判斷執(zhí)行腳本的是否根用戶,如果不是則輸出出錯(cuò)信息,退出。 添加語句,判斷是否有命令行參數(shù),如果有,假設(shè)是n,在后面的清除log的時(shí)候保留最后的n行;如果沒有,設(shè)n=50。 你可以不斷地找到新的方法來完善這個(gè)腳

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論