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