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

下載本文檔

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

文檔簡介

1、網(wǎng)線串口線宿主機(jī)(開發(fā)平臺(tái))目標(biāo)機(jī)(運(yùn)行平臺(tái))宿主機(jī)要求:1安裝操作系統(tǒng)RedHat linux 。2、宿主機(jī)配置網(wǎng)絡(luò)及各種服務(wù)器。3、建立交叉編譯調(diào)試環(huán)境?;贚inux的嵌入式系統(tǒng)開發(fā)模式二、宿主機(jī)Linux系統(tǒng)配置:1、安裝VMware tools:鼠標(biāo)移動(dòng)、顯示性能、網(wǎng)絡(luò)功能、共享資源2、配置桌面、網(wǎng)絡(luò):3、實(shí)現(xiàn)windows和linux共享:4、設(shè)置nfs服務(wù)器:建立交叉編譯環(huán)境方法:(共享法)共享設(shè)置./install.sh修改/root/.bash_profile注銷2、armv4l-unknown-linux-gcc1、arm-linux-gcc1)利用nfs或者文件夾共享,將

2、配好的redhat linux中opt/crosstools文件夾考到本地linux中opt目錄下。2)修改/root/.bash_profile文件或者利用共享覆蓋。3)注銷登錄PATH=$path:$home/bin/:第二章 Linux 程序設(shè)計(jì)基礎(chǔ)1、Linux下c程序開發(fā)2、Linux下的 shell 編程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ā): 如li

3、nux下的應(yīng)用程序的開發(fā)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)提供給用戶使用,并被證明是非??煽亢透咝У?。一個(gè)完整的開發(fā)工具應(yīng)該包括:編輯工具:vi編輯器編譯工具:gcc調(diào)試工具: gdb配置、項(xiàng)目管理工具2.1 Linux下 c 程序開發(fā)函數(shù)庫及系統(tǒng)頭文件:集成開發(fā)環(huán)境IDEKylixKdevelopRHID

4、ELinux 安裝時(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.c1)命令行模式: 用戶在用vi編輯文件時(shí),最初進(jìn)入的一般模式,此時(shí)鍵盤輸入當(dāng)做命令。在該模式中可以進(jìn)行光標(biāo)移動(dòng)、刪除、復(fù)制、粘貼等操作,但是無法編輯文字。

5、命 令功 能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)于鍵“”1G移動(dòng)光標(biāo)到文件的第1行G移動(dòng)光標(biāo)到文件的最后1行光標(biāo)命令命 令功 能Nx(Expurgate)刪除從光標(biāo)位置開始的連續(xù)N個(gè)字符(并復(fù)制到編輯緩沖區(qū))Ndd(Delete)刪除從光標(biāo)位置開始的連續(xù)N行(并復(fù)制到編輯緩沖區(qū))Nyy(Yank)復(fù)制從光標(biāo)位置開始的連續(xù)N行到編輯緩沖區(qū)p(Put)從編輯緩沖區(qū)復(fù)制文本到當(dāng)前光標(biāo)位置(即粘貼)u(Undo)取消上一次操作(即恢復(fù)功能)編輯命令

6、2)插入模式:在該模式下,vi編輯器進(jìn)入編輯狀態(tài):狀態(tài)命令命 令功 能a(Append)進(jìn)入編輯狀態(tài),從當(dāng)前光標(biāo)之前的位置開始插入鍵盤輸入的字符i(Insert)進(jìn)入編輯狀態(tài),從當(dāng)前光標(biāo)之后的位置開始插入鍵盤輸入的字符o(Open)進(jìn)入編輯狀態(tài),并插入一新行,光標(biāo)移到該新行的行首,以后鍵盤輸入的字符將插入到光標(biāo)位置ESC進(jìn)入命令行模式3)末行模式:在該模式下,vi編輯器實(shí)現(xiàn)文件的保存和退出。命 令功 能:q(Quit)退出沒有被修改的文件(若文件被修改了而沒有保存,則此命令無效):q!強(qiáng)制退出,且不保存修改過的部分:w(Write)保存文件,但不退出:w!強(qiáng)制保存文件,但不退出:wq / :x

7、(Exit)保存文件并退出:x!強(qiáng)制保存文件并退出:w File另存為File給出的文件名,不退出:w! File強(qiáng)制另存為File給出的文件名,不退出:r File(Read)讀入File指定的文件內(nèi)容插入到光標(biāo)位置2、編譯工具:gcc gcc是gnu推出的功能強(qiáng)大性能優(yōu)越的多平臺(tái)編譯器,gcc能將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í)行文件EL

8、F格式預(yù)處理器匯編器組譯器連接器.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 o test

9、test1.c test2.c test3.c 有多個(gè)源文件生成 testgcc 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)化。這些優(yōu)化在大多數(shù)情況下都會(huì)使程序執(zhí)

10、行的更快。 -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 Makefilea 項(xiàng)目目錄# make 有了Makefile文件,我們只用一個(gè)make命令就可以自動(dòng)智能地根據(jù)當(dāng)前的文件修改的情況編譯所需要的

11、文件和鏈接目標(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會(huì)對(duì)磁盤上的文件進(jìn)行檢查時(shí)間差,以便更新目標(biāo)文件。3、目標(biāo)文

12、件不一定是最后的可執(zhí)行文件,可以是任何中間文件,并可以做為其他目標(biāo)文件的依賴文件。# 一個(gè)簡單的Makefile的例子(以#開頭的為注釋行)test:prog.o code.ogcc o test prog.o code.oprog.o:prog.c prog.h code.hgcc c prog.c o prog.ocode.o:code.c code.hgcc c code.c o code.oclean:rm f *.o#make#make Makefile#make test命令行以tab鍵開始偽目標(biāo):#make clean例如 :用make編譯hello.c 單一文件 對(duì)于一個(gè)有很多

13、源文件的項(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、保存文件名列表b、保存可執(zhí)行命令名c、保存編譯器的參數(shù)變量引用:$VARNAME make解釋規(guī)則時(shí),VARNA

14、ME在等式右端展開為定義它的字符串。變量一般都在Makefile的頭部定義。按照慣例,所有的Makefile變量都應(yīng)該是大寫。如果變量的值發(fā)生變化,就只需要在一個(gè)地方修改,從而簡化了Makefile的維護(hù)。現(xiàn)在利用變量把前面的Makefile重寫一遍:OBJS=prog.o code.oCC=gcctest:$ OBJS $ CC o test $ OBJS prog.o:prog.c prog.h code.h$ CC c prog.c o prog.ocode.o:code.c code.h$ CC c code.c o code.oclean:rm f *.o 2、利用Makefile中

15、的其它變量:一個(gè)C編譯的具體命令將會(huì)是:$ CC $ CFLAGS c $ -o $CFLAGS: c編譯器的選項(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.oCC=gcctest:$ OBJS $ CC o $ $prog.o:prog.c prog.h code.hcode.o:code.c code.hclean:rm f *.o 使用automake和autoconf產(chǎn)生Makefile 在開始使用Autom

16、ake和autoconf之前,請(qǐng)先確認(rèn)系統(tǒng)已經(jīng)安裝以下的軟件:GNU AutomakeGNU AutoconfGNU m4PerlGNU 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)試器??梢允钩绦蜷_發(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)視程序

17、中變量的值; 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)試。如果要讓產(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ù)雜命令, 下面

18、列出了在使用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)break命令:設(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命令相

19、同。 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í)行下一條源代碼,進(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命令:

20、顯示調(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)碼,則刪除指定斷點(diǎn)。不指定參數(shù)則刪除所有的斷點(diǎn)。 22)Shell命令:執(zhí)行Linux Shell命令。 23)make命令:不退出gdb而重新編譯生成可執(zhí)行文件。 24)Quit命令:退出gdb。LINUX shell 編程變量特殊字符條件判斷結(jié)構(gòu)與循環(huán)結(jié)構(gòu)函數(shù)的定義和使用Shell是一個(gè)作為用戶與LINUX系統(tǒng)

21、間接口的程序,它允許用戶向操作系統(tǒng)輸入需要執(zhí)行的命令。shell編程語言如BASH、SH、TCSH、GAWK、Perl、Tcl和Tk都利用自己的解釋器。用這些語言編制的文件,可以直接運(yùn)行。編譯器則不同,它將生成一個(gè)獨(dú)立的二進(jìn)制代碼文件然后才可以運(yùn)行。變量用戶變量環(huán)境變量位置變量預(yù)定義變量用戶變量的定義及其使用與所有的編程語言一樣,shell也允許把值存在變量中,shell變量名以字母或下劃線字符開始,由字母、數(shù)字或下劃線組成要把值存入變量,只要寫出變量名,或緊跟一個(gè)=,再加變量值即可例如:variable=value count=1在程序中使用變量的值時(shí),要在變量名前面加上一個(gè)符號(hào)“$”。這個(gè)

22、符號(hào)告訴Shell,要讀取該變量的值。例如:echo $variable環(huán)境變量環(huán)境變量是一種特殊的變量,其特點(diǎn)為:它們可以由其他程序傳遞給腳本在腳本中被調(diào)用的任何程序都將繼承環(huán)境變量可以像定義一個(gè)變量一樣來設(shè)置環(huán)境變量,在標(biāo)記它為環(huán)境變量時(shí)需要使用“ export ”命令應(yīng)用示例:$ export MYENV=1$ echo $MYENV使用“ set ”命令可以獲取當(dāng)前上下文中全部的變量 位置參數(shù)執(zhí)行Shell腳本時(shí)可以使用參數(shù)。由出現(xiàn)命令行上的位置確定的參數(shù)稱做位置參數(shù)。在sh中總共有十個(gè)位置參數(shù),其對(duì)應(yīng)的名稱依次是$0,$1,$2,.$9。其中$0始終表示命令名或Shell腳本名,對(duì)于

23、一個(gè)命令行,必然有命令名,也就必定有$0;而其它位置參數(shù)依據(jù)實(shí)際需求,可有可無。應(yīng)用示例:編輯ison文件內(nèi)容如下who | grep $1 執(zhí)行:$ chmod +x ison $ ./ison bc shell將用bc代替$1,命令行變?yōu)椋簑ho | grep bc shift命令shift命令的作用是把位置參數(shù)左移原來在$2中的內(nèi)容賦給$1,$3中內(nèi)容賦給$2,依此類推。原來$1中的值就丟失了。$#(參數(shù)變量的個(gè)數(shù))也自動(dòng)減1shift命令(二)編輯shiftdemo程序如下: echo $# $* shift echo $# $* shift echo $# $* shift echo

24、 $# $* 執(zhí)行: chmod +x shiftdemo./ shiftdemo a b c預(yù)定義變量$# 變量用于存放命令行中所鍵入的參數(shù)個(gè)數(shù)shell程序測試這個(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ù)傳遞給了$#變量 預(yù)定義變量$* 變量可以引用傳遞給程序的所有參數(shù)經(jīng)常應(yīng)用在參數(shù)不確定或者參數(shù)數(shù)目可變的程序

25、中應(yīng)用示例:編輯args2文件內(nèi)容如下: echo $# arguments passed echo they are $* 執(zhí)行 : $ chmod +x args2 $ arg2 a b c $ arg2 a b $ arg2 預(yù)定義變量$變量$變量和$*變量功能基本相同 改寫args2程序如下: echo $# arguments passed echo they are $預(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變量

26、$? 中,可以用echo命令在終端上顯示它的值應(yīng)用示例$ who | grep bc $ echo $? $ who | grep 123 $ echo $? 特殊字符 通配符通常的通配符有三種:* 星號(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)中所列出的字符。 特殊字符 引號(hào)

27、雙引號(hào)” ”由雙引號(hào)括起來的字符,除$、倒引號(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)槠胀ㄗ址?條件判斷條件判斷語句是幾乎所有編程語言中都有的語句,shell中有兩種條件判斷語句:if表達(dá)式case表達(dá)式 if表達(dá)式一般結(jié)構(gòu) if conmmand1 then elif command2 then else

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

29、ssion 其中expression表示要測試的條件。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è)空白字符分隔 test命令(二)test命令的另一種格式shell程序使用test命令非常頻繁,因此產(chǎn)生了另一種公認(rèn)的命令格式: expression “”實(shí)際上就是命令的名字,同時(shí)要求在表達(dá)式的有一個(gè)配對(duì)的“”,在“之后和”之前都要有空格應(yīng)用示例:$

30、name=bc$ “$name” = bc $ echo $? test命令(三)整數(shù)操作符test命令還有一類進(jìn)行整數(shù)比較的操作符,見右表:例如:操作符“-eq”檢測兩個(gè)整數(shù)是否相等,如果有一個(gè)變量名為count,想看看它的值是否為0,則可以寫成: “$count” eq 0 操作符返回真(退出狀態(tài)為0)的條件int1 eq int2int1 等于 int2int1 ge int2 int1 大于或等于 int2int1 gt int2int1 大于 int2int1 le int2 int1 小于或等于 int2int1 lt int2int1 小于 int2int1 ne int2int

31、1 不等于 int2test命令(四)文件操作符test提供了一類問詢文件狀態(tài)的一元操作符,見右表:例如: -f /etc/fstab 檢測fstab文件是否存在且是否為普通文件 if結(jié)構(gòu)應(yīng)用示例使用ifthenelse結(jié)構(gòu)編寫一個(gè)判斷命令行所傳入?yún)?shù)大小的程序?qū)⑺斎霐?shù)值存放在位置參數(shù)$1中若$1100,則輸出:the number is greater than 100若$1 do echo $i done可以看到終端上依次輸出1、2、3 不帶列表的for命令for命令也可以寫成以下形式:for vardo commanddone shell也能認(rèn)出這種少了in的特殊格式,shell會(huì)自動(dòng)

32、將命令行鍵入的所有參數(shù)依次組織成列表。應(yīng)用示例: 編輯fordemo文件內(nèi)容如下:echo Number of arguments passed is $# for arg do echo $arg done執(zhí)行 : $ chmod +x fordemo $ ./fordemo a b cwhile命令第二種循環(huán)命令是while,格式為:while command1 do command done 先執(zhí)行command1,并檢測其退出狀態(tài),如果為0則執(zhí)行do與done之間命令,再次檢測直到command1退出狀態(tài)不為0如果第一次執(zhí)行command1時(shí)退出狀態(tài)就不為0,那么do和done之間的命

33、令可能根本不執(zhí)行while命令應(yīng)用示例while循環(huán)通常跟shift命令結(jié)合使用,以處理命令行中鍵入的參數(shù)個(gè)數(shù)可變的情況編寫whiledemo程序如下: while “$#” -ne 0 do echo “$1” shift done執(zhí)行: $ chmod +x whiledemo $ ./whiledemo a b cshift命令使位置變量向下移($2到$1,$3到$2), 并且$#遞減。until命令until命令跟while很像,區(qū)別在于只要在until后面的命令退出狀態(tài)不為0,循環(huán)就一直執(zhí)行下去,其格式為:until command1do commanddone跟while命令一樣,

34、如果第一次執(zhí)行command1時(shí)返回的退出狀態(tài)為0,do和done之間的命令可能 跟本不會(huì)執(zhí)行。 until命令示例程序編輯untildemo程序如下: if $# -ne 1 then echo Usage:untildemo user exit 1fiuntil who | grep $1 /dev/nulldo sleep 10doneecho $1 has logged on執(zhí)行: $chmod +x untildemo $ ./untildemo bc $ ./untildemo 123結(jié)束進(jìn)程:ctrl+Cbreak命令與continue命令break命令與continue命令與C

35、中相應(yīng)命令功能相同break命令只退出循環(huán)而不退出程序continue命令不退出循環(huán),只跳過循環(huán)體后面的命令,而后循環(huán)像正常情況一樣繼續(xù)執(zhí)行 函數(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)用.簡單函數(shù)的例子 #!/bin/bash fun () i

36、f -z $1 # 第一個(gè)參數(shù)是否長度為零? then echo -Parameter #1 is zero length.- # 則沒有參數(shù)傳遞進(jìn)來. else echo -Param #1 is $1.- fi funfun “hello”綜合實(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/w

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

38、誤消息,并且在不是root 身份的時(shí)候退出.LOG_DIR=/var/log# 使用變量比把代碼寫死的好.cd $LOG_DIRcat /dev/null messagescat /dev/null wtmpecho Logs cleaned up.“exit # 這個(gè)命令是一種正確并且合適的退出腳本的方法.綜合實(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è)腳本,并提高效率。綜合實(shí)驗(yàn)一:清除log 文件#!/bin/bash# 說明:刪除logfile 的腳本#LOG_DIR=/var/logROOT_UID=0 # $UID 為0 的用戶才具

溫馨提示

  • 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)論