版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Linux編程及應(yīng)用
郵箱:1Linux編程及應(yīng)用1參考教材:
linux軟件工程師(C語言)實用教程劉加海,張益先主編科學(xué)出版社《UNIX環(huán)境高級編程》(第2版),史蒂文斯著Linux高級程序設(shè)計:(英)美斯特,(美)布盧著,陳健等譯人民郵電出版社2參考教材:
linux軟件工程師(C語言)實用教程劉加海課程要求:作業(yè)和平時表現(xiàn):20%
上機(jī)實驗:20%
期末考試:60%3課程要求:3課程內(nèi)容:Shell編程Linux系統(tǒng)程序設(shè)計基礎(chǔ)文件分割和多文件編譯linux環(huán)境下系統(tǒng)函數(shù)的使用文件的操作串行通信進(jìn)程控制進(jìn)程間的通信網(wǎng)絡(luò)程序設(shè)計4課程內(nèi)容:4第一章Shell編程5第一章Shell編程5本章學(xué)習(xí)目標(biāo)了解shell編程的基本概念及其特點(diǎn)掌握shell各種變量的區(qū)別掌握正則表達(dá)式的使用方法熟悉shell的各種流程控制了解shell的函數(shù)6*本章學(xué)習(xí)目標(biāo)了解shell編程的基本概念及其特點(diǎn)6*目錄1.1Shell概述1.2創(chuàng)建和執(zhí)行shell程序1.3變量1.4位置參數(shù)1.5特殊字符1.6運(yùn)算符1.7輸入和輸出1.8表達(dá)式的比較1.9流程控制語句1.10函數(shù)7*目錄1.1Shell概述1.7輸入和輸出7*1.1Shell概述Shell就像一個殼層,這個殼層介于用戶和操作系統(tǒng)之間,負(fù)責(zé)將用戶的命令解釋為操作系統(tǒng)可以接收的低級語言,并將操作系統(tǒng)響應(yīng)的信息以用戶可以了解的方式來顯示。硬件操作系統(tǒng)KernelShell8*1.1Shell概述Shell就像一個殼層,這個殼層介于用1.1Shell概述Shell角色圖Shell操作系統(tǒng)kernel硬件9*1.1Shell概述Shell角色圖Shell操作系統(tǒng)硬件1.1Shell概述從用戶登陸到注銷期間,用戶輸入的每個命令都會經(jīng)過解譯及執(zhí)行,其負(fù)責(zé)機(jī)制就是shell。shell是一個命令語言解釋器,它擁有自己內(nèi)建的shell命令集,shell也能被系統(tǒng)中其他應(yīng)用程序所調(diào)用。用戶在提示符下輸入的命令都由shell先解釋然后傳給Linux核心。有一些命令,如改變工作目錄命令cd,是shell內(nèi)置命令。還有一些命令,例如拷貝命令cp和移動命令mv,是存在于文件系統(tǒng)中某個目錄下的單獨(dú)的程序。對用戶而言,不必關(guān)心一個命令是建立在shell內(nèi)部還是一個單獨(dú)的程序。
10*1.1Shell概述從用戶登陸到注銷期間,用戶輸入的每個命1.1Shell概述shell的主要版本在Linux系統(tǒng)中常見的shell版本有以下幾種。(1)Bourneshell(sh):它是UNIX最初使用的shell,并且在每種UNIX都可以使用。它在shell編程方面相當(dāng)優(yōu)秀,但處理與用戶的交互方面不如其他幾種shell。(2)Cshell(csh):它最初由BillJoy編寫,它更多地考慮了用戶界面的友好性,支持如命令補(bǔ)齊等一些Bourneshell所不支持的特性,但其編程接口做得不如Bourneshell。Cshell被很多C程序員使用,因為Cshell的語法和C語言的很相似,Cshell也由此得名。(3)Kornshell(ksh):它集合了Cshell和Bourneshell的優(yōu)點(diǎn),并且和Bourneshell完全兼容。11*1.1Shell概述shell的主要版本11*1.1Shell概述(4)BourneAgainshell(bash):bash是大多數(shù)Linux系統(tǒng)的默認(rèn)shell。它是Bourneshell的擴(kuò)展,并與Bourneshell完全向后兼容,而且在Bourneshell的基礎(chǔ)上增加和增強(qiáng)了很多特性。。(5)tcsh:它是Cshell的一個擴(kuò)展版本,與csh完全向后兼容,但它包含了更多使用戶感覺方便的新特性,其最大的提高是在命令行編輯和歷史瀏覽方面。它不僅和Bashshell提示符兼容,而且還提供比Bashshell更多的提示符參數(shù)。(6)pdksh:它是一個專門為Linux系統(tǒng)編寫的Kornshell(ksh)的擴(kuò)展版本。Ksh是一個商用shell,不能免費(fèi)提供,而pdksh是免費(fèi)的。12*1.1Shell概述(4)BourneAgainshe表1Linux中的各種shellshell名稱描述位置
ash一個小shell(和sh類似)/bin/ashash.static一個不依靠軟件庫的ash版本/bin/ash.staticbashBourneAgainShell/bin/bashbash2BourneAgainShell的新版本/bin/bash2bshash的一個符號鏈接/bin/bshcshCshell,tcsh的一個符號鏈接/bin/cshksh公共域受限制的shell(針對網(wǎng)絡(luò)操作)/usr/bin/kshshbash的一個符號鏈接/bin/shtcsh和csh兼容的shell/bin/tcshzsh一個和csh,ksh和sh兼容的shell/bin/zsh1.1Shell概述13*表1Linux中的各種shell1.1Shell概述11.1Shell概述判斷登入shell使用echo命令來查詢系統(tǒng)的“SHELL”環(huán)境變量,命令如下:#echo$SHELL14*1.1Shell概述判斷登入shell14*1.1Shell概述暫時變更shell除非是在受限的shell中,否則若要變更使用shell,只要執(zhí)行該Shell程序名稱(shell_name),即可切換到不同的Shell。如:#sh(或#csh等等)此處的shell_name是指shell的名稱(例如,sh或csh)。暫時變更shell,可在其它的shell中進(jìn)行試驗。鍵入exit或CTRL-D可以回到原始的shell中。15*1.1Shell概述暫時變更shell15*1.1Shell概述16*1.1Shell概述16*1.1Shell概述Shell功能介紹交互式處理(InteractiveProcessing)接收來自用戶輸入的命令后,shell會根據(jù)命令類型的不同來執(zhí)行,執(zhí)行完畢后,shell會將結(jié)果回傳給用戶,并等待用戶下一次輸入。用戶執(zhí)行exit或是按Ctrl+D來注銷shell才會結(jié)束。17*1.1Shell概述Shell功能介紹17*1.1Shell概述命令補(bǔ)全功能指用戶輸入命令后,有時不需輸入完整的命令,而系統(tǒng)會自動找出最符合的命令名稱,這種功能可以節(jié)省輸入長串命令的時間。不需要輸入完整的文件名,只需輸入開頭幾個字母,然后按Tab鍵時候,系統(tǒng)會補(bǔ)充完整,連續(xù)按兩次Tab(Esc)鍵系統(tǒng)會顯示所有符合輸入前綴的文件名稱。若忘了命令的全名,而只記得命令的開頭字母,按Tab鍵一次會補(bǔ)充完整,連續(xù)按兩次Tab(Esc)鍵系統(tǒng)會顯示所有符合輸入前綴的命令名稱。18*1.1Shell概述命令補(bǔ)全功能18*1.1Shell概述查閱歷史記錄-h(huán)istory命令在Linux系統(tǒng)上輸入命令并按下Enter后,這個命令就會存放在命令記錄表(~/.bash_history)中,預(yù)定的記錄為1000筆,這些都定義在環(huán)境變量中。列出所有的歷史記錄:#history只列出最近5筆記錄犯例:#history5使用命令記錄號碼執(zhí)行命令:#!561重復(fù)執(zhí)行上一個命令:#!!執(zhí)行最后一次以ls開頭的命令:#!ls19*1.1Shell概述查閱歷史記錄-h(huán)istory命令19*1.1Shell概述別名(Alias)功能查詢目前系統(tǒng)所有別名:#alias設(shè)置別名:#aliasdir=‘ls-l’使用別名:#dir/etc取消別名:#unaliasdiralias命令的效力僅限于該次登錄,在注銷系統(tǒng)后,這個別名的定義就會消失。如果希望每次登陸都使用這些別名,則應(yīng)該將別名的設(shè)置加入“~/.bashrc”文件中,若是寫入“/etc/bashrc”文件中,則系統(tǒng)上的所有用戶都能使用這個別名。20*1.1Shell概述別名(Alias)功能20*1.2創(chuàng)建和執(zhí)行shell程序不同的shell其編程(命令)語法有所不同較常見的shell腳本是bash另一種較常見的shell腳本是tcsh,其命令/語法類似C語言學(xué)習(xí)腳本編程的原因在有些場合,希望一些常用的命令集能用一個命令實現(xiàn);可以處理一些特定的問題,如計算每月上網(wǎng)的總時數(shù)。21*1.2創(chuàng)建和執(zhí)行shell程序不同的shell其編程(1.2創(chuàng)建和執(zhí)行shell程序Shell腳本編程前的準(zhǔn)備文本編輯器(vi或vim,gedit等)腳本解釋程序(bash,tcsh等)其他工具(用來擴(kuò)充Shell腳本的功能,如:grep,wc)22*1.2創(chuàng)建和執(zhí)行shell程序Shell腳本編程前的準(zhǔn)備1.2創(chuàng)建和執(zhí)行shell程序例:顯示當(dāng)前的日期時間、執(zhí)行路徑、用戶賬號及所在的目錄位置。1.建立shell腳本如建立一個名為ex1的shell腳本,可提示符后輸入命令:$viex1.sh23*1.2創(chuàng)建和執(zhí)行shell程序例:顯示當(dāng)前的日期時間、執(zhí)行1.2創(chuàng)建和執(zhí)行shell程序在vi編輯器中輸入下列內(nèi)容:
#!/bin/bash#Thisscriptisatest!echo–n“Dateandtimeis:”dateecho–n“Theexecutablepathis:”$PATHecho“Yournameis:`whoami`”echo-n“Yourcurrentdirectoryis:”pwd#end2.用三種方法執(zhí)行shell腳本24*1.2創(chuàng)建和執(zhí)行shell程序在vi編輯器中輸入下列內(nèi)容:1.2創(chuàng)建和執(zhí)行shell程序(1)輸入定向到shell腳本。其一般形式是:$bash<腳本名例如:$bash<ex1(2)以腳本名作為參數(shù)。其一般形式為:$bash腳本名[參數(shù)]例如:$bashex1如果以當(dāng)前shell執(zhí)行一個shell腳本,則可以使用如下簡便形式:$.腳本名[參數(shù)](3)使用chmod命令將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。例如:
$chmoda+xex1$./ex125*1.2創(chuàng)建和執(zhí)行shell程序(1)輸入定向到shell腳1.2創(chuàng)建和執(zhí)行shell程序在編寫shell時,第一行一定要指明系統(tǒng)需要那種shell解釋你的shell程序,如:#!/bin/bash,#!/bin/csh,/bin/tcsh,還是#!/bin/pdksh。用上面執(zhí)行shell腳本的三種方法分別體會這句話的作用。26*1.2創(chuàng)建和執(zhí)行shell程序在編寫shell時,第一行一1.3變量3種類型:環(huán)境變量:系統(tǒng)提供,不用定義,可以修改內(nèi)部變量:系統(tǒng)提供,不用定義,不能修改用戶變量:用戶定義,可以修改與其他語言的區(qū)別:非類型性質(zhì),也就是不必指定變量是數(shù)字或字符串等。27*1.3變量3種類型:27*1.3變量環(huán)境變量Linux環(huán)境(也稱為shell環(huán)境)由許多變量及這些變量的值組成,由這些變量和變量的值決定環(huán)境外觀。這些變量就是環(huán)境變量。主要環(huán)境變量的有:(1)HOME:用戶目錄的全路徑名。(2)UID當(dāng)前用戶的識別字,取值是由數(shù)位構(gòu)成的字串。(3)LOGNAME:即用戶的注冊名,由Linux自動設(shè)置。(4)MAIL:用戶的系統(tǒng)信箱的路徑。(5)PATH:shell從中查找命令的目錄列表。28*1.3變量環(huán)境變量28*1.3變量(6)PS1:shell的主提示符,在特權(quán)用戶下,默認(rèn)的主提示符是#,在普通用戶下,默認(rèn)的主提示符是$。(7)PS2:在Shell接收用戶輸入命令的過程中,如果用戶在輸入行的末尾輸入“\”然后回車,或者當(dāng)用戶按回車鍵時Shell判斷出用戶輸入的命令沒有結(jié)束時,就顯示這個輔助提示符,提示用戶繼續(xù)輸入命令的其余部分,默認(rèn)的輔助提示符是>。(8)PWD:用戶當(dāng)前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。它指出用戶目前在Linux文件系統(tǒng)中處在什么位置。它是由Linux自動設(shè)置的。(9)SHELL:用戶當(dāng)前使用的shell。它也指出你的shell解釋程序放在什么地方。(10)TERM:用戶終端類型。29*1.3變量(6)PS1:shell的主提示符,在特權(quán)用戶下1.3變量$HOME/.bash_profile(/etc/profile)env30*1.3變量$HOME/.bash_profile(/etc1.3變量export在任何時候,創(chuàng)建的變量都只是當(dāng)前Shell的局部變量,不能被Shell運(yùn)行的其他命令或Shell程序所用,export命令可以將一個局部變量提供給Shell執(zhí)行的其他命令使用。31*1.3變量export31*1.3變量內(nèi)部變量(預(yù)定義變量)內(nèi)部變量是Linux所提供的一種特殊類型的變量,這類變量在程序中用來作出判斷。在shell程序內(nèi)這類變量的值是不能修改的。部分內(nèi)部變量是:$#——傳送給shell程序的位置參數(shù)的個數(shù)$?——命令執(zhí)行后返回的狀態(tài)$0——當(dāng)前執(zhí)行的進(jìn)程的名稱$*——調(diào)用shell程序時所傳送的全部參數(shù)成的單字符串32*1.3變量內(nèi)部變量(預(yù)定義變量)32*1.3變量ex1.sh的示范例子:
#ex9_3_1.shecho“Numberofparametersis”$#echo“Programnameis”$0echo“Parametersasasinglestringis”$*
在bash中,從命令行中執(zhí)行ex9_3_1.sh如下:
#.ex9_3_1.shzhangli
將得到如下的結(jié)果:33*1.3變量ex1.sh的示范例子:33*1.3變量用戶變量1.變量名用戶定義的變量是最普通的shell變量。變量名是以字母或下線符開頭的字母、數(shù)字和下線符序列,并且大小寫字母意義不同。在定義變量時,變量名前不應(yīng)加符號$,在引用變量的內(nèi)容時則應(yīng)在變量名前加$;在給變量賦值時,等號兩邊一定不能留空格,若變量中本身就包含了空格,則整個字串都要用雙引號括起來。在編寫Shell程序時,為了使變量名和命令名相區(qū)別,建議所有的變量名都用大寫字母來表示。34*1.3變量用戶變量34*1.3變量2.變量賦值給變量賦值的過程也是聲明一個變量的過程。set顯示本地所有的變量變量的賦值很簡單,其一般形式是:變量名=字符串/數(shù)字例如:lcount=0myname=fedora有時想在說明一個變量并對它設(shè)置為一個特定值后就不在改變它的值時,可以用下面的命令來保證一個變量的只讀性:readonly
變量名35*1.3變量2.變量賦值35*1.3變量36*1.3變量36*1.3變量37*1.3變量37*1.3變量3.訪問變量值可以通過給變量名加上前綴$(美元符)來訪問變量的值。例如:如果要把myname的值分配給變量yourname,那么可以執(zhí)行下面的命令:yourname=$myname38*1.3變量3.訪問變量值38*1.3變量4.變量清除unsetvariable-name例:39*1.3變量4.變量清除39*1.3變量給變量賦值
命令環(huán)境locunt=0pdksh和bashsetlocunt=0tcshmyname=Sanjivpdksh和bashsetname=Sanjivtcshmyname=’SanjivGuha’pdksh和bashsetname=’SanjivGuha’tcsh40*1.3變量給變量賦值命令1.3變量給變量賦值訪問變量值
命令環(huán)境lcount=$varpdksh和bashsetlcount=$vartcsh41*1.3變量給變量賦值訪問變量值命令1.4位置參數(shù)1.位置參數(shù)及引用可以編寫一個shell腳本,當(dāng)從命令行或者從其他shell腳本中調(diào)用它的時候,這個腳本接收若干參數(shù)。這些選項是通過Linux作為位置參數(shù)(positionalparameter)提供給shell程序的。在shell腳本中應(yīng)有變量,接收實參,這類變量的名稱很特別,分別是1,2,3,…,這類變量稱為位置變量。位置參數(shù)1存放在位置變量1中,位置參數(shù)2存放位置變量2中,……,在程序中可以使用$1,$2,……來訪問。42*1.4位置參數(shù)1.位置參數(shù)及引用42*1.4位置參數(shù)2.用set命令為位置參數(shù)賦值在shell程序中可以利用set命令為位置參數(shù)賦值或重新賦值。(1)一般格式:set[參數(shù)表](2)說明:該命令后面無參數(shù)時,將顯示系統(tǒng)中的系統(tǒng)變量的值;如果有參數(shù)將分別給位置參數(shù)賦值。43*1.4位置參數(shù)2.用set命令為位置參數(shù)賦值43*1.4位置參數(shù)3.位置參數(shù)移動當(dāng)位置變量個數(shù)超出9個時,就不能直接引用位置大于9的位置變量了,必須用shift命令移動位置參數(shù)。(1)一般形式:shift[n](2)說明:每次執(zhí)行時,把位置參數(shù)向左移動n位。如果沒有參數(shù),每次執(zhí)行時,把位置參數(shù)向左移動1位。44*1.4位置參數(shù)3.位置參數(shù)移動44*1.4位置參數(shù)下述是一個shell程序的ex9_4_1.sh,只帶了一個參數(shù)(名字),并在屏幕上顯示這個名字:#Namedisplayprogramif[$#-eq0]thenecho“Namenotprovided”elseecho”Yournameis$1”fi45*1.4位置參數(shù)下述是一個shell程序的ex9_4_1.s1.4位置參數(shù)在bash中,如果執(zhí)行ex9_4_1.sh如下:#.ex9_4_1.sh將得到輸出:Namenotprovided但是,如果執(zhí)行ex9_4_1.sh如下:#.ex9_4_1.shzhang則得到如下的輸出:Yournameiszhangex9_4_1.sh還說明了shell編程的另一個方面,即內(nèi)部變量。在ex9_4_1.sh中的變量$#是內(nèi)部變量,并提供傳給shell程序的位置參數(shù)的數(shù)目。46*1.4位置參數(shù)在bash中,如果執(zhí)行ex9_4_1.sh如1.4位置參數(shù)位置變量小結(jié)位置變量表示$0,$1……$9在腳本中使用位置參數(shù)向系統(tǒng)命令傳遞參數(shù)$0$1$2$3$4$5$6$7$8$9腳本名字ABCDEF47*1.4位置參數(shù)位置變量小結(jié)$0$1$2$3$4$5$6$71.4位置參數(shù)48*1.4位置參數(shù)48*1.5特殊字符特殊字符中的某些字符字符說明
$指出shell變量名的開始
|把標(biāo)準(zhǔn)輸出通過管道傳送到下個命令
#標(biāo)記注釋開始
&在后臺執(zhí)行進(jìn)程
?匹配一個字符*匹配一個或幾個字符
>輸出重定向操作符
<輸入重定向操作符49*1.5特殊字符特殊字符中的某些字符49*1.5特殊字符特殊字符中的某些字符(續(xù))
字符說明
>>輸出重定向操作符{添加到文件}<<跟在輸入結(jié)束字符串后(HERE)操作符
[]列出字符的范圍
[a-z]意a到z的全部字符
[a,z]意指a或z字符
.filmname執(zhí)行(“源”)文件空格在兩個字之間的間隔符50*1.5特殊字符特殊字符中的某些字符(續(xù))50*1.5特殊字符注釋符‘#’在shell編程中經(jīng)常要對某些正文行進(jìn)行注釋,以增加程序的可讀性。在Shell中以字符“#”開頭的正文行表示注釋行。51*1.5特殊字符注釋符‘#’51*1.5特殊字符雙引號在字符串含有嵌入的空格時,用雙引號括起來。這是一個有關(guān)bash的例子:var=”teststring”newvar=”Valueofvaris$var”echo$newvar執(zhí)行上面的三行shell程序,可得到如下的結(jié)果:Valueofvaristeststring52*1.5特殊字符雙引號52*1.5特殊字符單引號利用單引號把字符括起來,以阻止shell解析變量。把前面的雙引號改為單引號var=”teststring”newvar=‘Valueofvaris$var’echo$newvar執(zhí)行程序可得到如下的結(jié)果:Valueofvaris$var53*1.5特殊字符單引號53*1.5特殊字符反斜杠在某個字符前利用反斜杠可以阻止shell把后面的字符解釋為特殊字符。例如,把$test的值賦給變量var。輸入如下命令:var=$test如下命令才把$test存放在var中:var=\$test54*1.5特殊字符反斜杠54*1.5特殊字符55*1.5特殊字符55*1.5特殊字符反引號通知shell執(zhí)行由反引號定義的字符串。當(dāng)需要把執(zhí)行命令的結(jié)果存放在變量中時,就可以在shell程序中利用反引號。例1:統(tǒng)計當(dāng)前目錄下一個文件中test.txt有幾行并把結(jié)果存在叫做var的變量中:var=`wc-ltest.txt`例2:string=”currentdirectoryis`pwd`”echo$stringcurrentdirectouris/home/xyz56*1.5特殊字符反引號56*1.5特殊字符示例代碼運(yùn)行結(jié)果57*1.5特殊字符示例代碼57*1.5特殊字符管道可以通過管道把一個命令的輸出傳遞給另一個命令作為輸入。管道用豎杠|表示。格式:命令1|命令2舉例:catmyls-l|grep"myfile"58*1.5特殊字符管道58*1.5特殊字符文件重定向改變程序運(yùn)行的輸入來源和輸出地點(diǎn)。重定向標(biāo)準(zhǔn)輸出catfile|sort>sort.outpwd>>path.out>newfile重定向標(biāo)準(zhǔn)輸入sort<filesort<name.txt>name.out59*1.5特殊字符文件重定向59*1.5特殊字符60*1.5特殊字符60*1.5特殊字符61*1.5特殊字符61*1.6運(yùn)算符運(yùn)算符是對計算機(jī)發(fā)的指令運(yùn)算對象數(shù)字、字符變量表達(dá)式表達(dá)式:運(yùn)算符和運(yùn)算對象的組合體62*1.6運(yùn)算符運(yùn)算符是對計算機(jī)發(fā)的指令62*1.6運(yùn)算符$[]表示形式告訴shell對方括號中的表達(dá)式求值$[2+8]63*1.6運(yùn)算符$[]表示形式告訴shell對方括號中的1.6運(yùn)算符賦值運(yùn)算符=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=64*1.6運(yùn)算符賦值運(yùn)算符64*1.6運(yùn)算符表達(dá)式替換$[]和$(())兩種格式功能一樣,所有的shell的求值都是用整數(shù)完成$[]可以接受不同基數(shù)的數(shù)字[base#n]n表示基數(shù)從2到36的任何基數(shù)65*1.6運(yùn)算符表達(dá)式替換65*1.7輸入和輸出echoecho命令可以顯示文本行或變量,或者把字符串輸入到文件。echo[option]string-e解析轉(zhuǎn)義字符-n回車不換行,linux系統(tǒng)默認(rèn)回車換行轉(zhuǎn)義符(\c,\f,\t,\n,\a)c不換行,f進(jìn)紙,t跳格,n換行,a響鈴。。。66*1.7輸入和輸出echo66*1.7輸入和輸出67*1.7輸入和輸出67*1.7輸入和輸出readread語句可以從鍵盤或文件的某一行文本中讀入信息,并將其賦給一個變量。readvarible1varible2…如果只指定了一個變量,那么read將會把所有的輸入賦給該變量,直到遇到第一個文件結(jié)束符或回車;如果給出了多個變量,它們按順序分別被賦予不同的變量。Shell將用空格作為變量之間的分隔符。68*1.7輸入和輸出read68*1.7輸入和輸出69*1.7輸入和輸出69*1.8表達(dá)式的比較shell程序中的test命令在bash/pdksh中,命令test用于計算一個條件表達(dá)式的值。他們經(jīng)常在條件語句和循環(huán)語句中被用來判斷某些條件是否滿足。test命令的語法格式:testexpression
或者
[expression]70*1.8表達(dá)式的比較shell程序中的test命令70*1.8表達(dá)式的比較1.數(shù)字比較-eq比較兩個數(shù)是否相等-ne比較兩個數(shù)是否不等-gt比較一個數(shù)是否大于另一個數(shù)-ge比較一個數(shù)是否大于或是等于另一個數(shù)-lt比較一個數(shù)是否小于另一個數(shù)-le比較一個數(shù)是否小于或是等于另一個數(shù)71*1.8表達(dá)式的比較1.數(shù)字比較71*1.8表達(dá)式的比較例72*1.8表達(dá)式的比較例72*1.8表達(dá)式的比較2.字符串比較=比較兩個字符串是否相等,同則為“是”!=比較兩個字符串是否不相等,不同則為“是”-z判斷字符長度是否等于零,等于則為“是”
-n判斷字符長度是否大于零,大于零則為“是”73*1.8表達(dá)式的比較2.字符串比較73*1.8表達(dá)式的比較示例代碼74*1.8表達(dá)式的比較示例代碼74*1.8表達(dá)式的比較運(yùn)行結(jié)果75*1.8表達(dá)式的比較運(yùn)行結(jié)果75*1.8表達(dá)式的比較3.文件操作符-e如果文件存在則為真-r確定是否對文件設(shè)置了讀許可-w確定文件是否設(shè)置了寫許可-x確定文件是否設(shè)置了執(zhí)行許可-s確定文件是否具有大于零的長度-d確定文件是否為目錄-f確定文件是否為普通文件-L
確定文件是否為符號連接文件76*1.8表達(dá)式的比較3.文件操作符76*1.8表達(dá)式的比較例77*1.8表達(dá)式的比較例77*1.8表達(dá)式的比較4.邏輯操作符邏輯操作符用來根據(jù)邏輯規(guī)則比較表達(dá)式。!,-a,-o字符表示NOT、AND和OR!求反(”非”)邏輯表達(dá)式-a邏輯AND(”與”)兩個邏輯表達(dá)式-o邏輯OR(”或”)兩個邏輯表達(dá)式78*1.8表達(dá)式的比較4.邏輯操作符78*1.8表達(dá)式的比較例79*1.8表達(dá)式的比較例79*1.9流程控制語句一、條件語句二、循環(huán)語句三、雜項語句80*1.9流程控制語句一、條件語句80*1.9流程控制語句——一、條件語句一、條件語句1.if語句2.case語句81*1.9流程控制語句——一、條件語句一、條件語句81*1.9流程控制語句——一、條件語句1.if語句if語句通過判斷邏輯表達(dá)式來作出選擇,在bash中的條件語句有如下的格式:if[expression];thenstatementselif[expression];thenstatementselsestatementsfiif條件是可以嵌套的。82*1.9流程控制語句——一、條件語句1.if語句82*1.9流程控制語句——一、條件語句2.case語句case語句是用來執(zhí)行依賴于離散值或是匹配指定變量值的范圍的語句。bash的case語句如下:casestrinstr1|str2)statements;;str3|str4)statements;;*)statements;;esac每個條件下用雙分號(;;)來終止語句!83*1.9流程控制語句——一、條件語句2.case語句每個1.9流程控制語句——一、條件語句84*1.9流程控制語句——一、條件語句84*1.9流程控制語句——二、循環(huán)語句循環(huán)語句:用于重復(fù)執(zhí)行一系列命令。一)for語句二)until語句三)while語句四)select語句85*1.9流程控制語句——二、循環(huán)語句循環(huán)語句:用于重復(fù)執(zhí)行一一)for語句1.第一種格式如下:for變量名in列表do命令1命令2?done當(dāng)變量值在列表里,for循環(huán)即執(zhí)行一次所有命令,使用變量名訪問列表中取值。命令可為任何有效的shell命令和語句。變量名為任何單詞。In列表用法是可選的,如果不用它,for循環(huán)使用命令行的位置參數(shù)。in列表可以包含替換、字符串和文件名.例如:86*一)for語句1.第一種格式如下:86*一)for語句87*一)for語句87*例:假設(shè)需要把目錄中的每個文件在一個叫做backup的子目錄中建立備份在bash中執(zhí)行如下的程序:一)for語句88*例:假設(shè)需要把目錄中的每個文件在一個叫做backup的子目錄一)for語句89*一)for語句89*2.第二種格式如下:
forcurvardostatementsdone
在這種格式中,對傳給shell程序的每個位置參數(shù)執(zhí)行一次statements。對每次循環(huán),把位置參數(shù)的當(dāng)前值賦給變量curvar。記住$@提供傳給shell程序的一系列參數(shù),全部參數(shù)排在一起。這種格式也可以寫成如下:forcurvarin“$@”dostatesmentsdone一)for語句90*2.第二種格式如下:這種格式也可以寫成如下:一)for語一)for語句91*一)for語句91*3.第三種格式:for((i=0;i<10;i++))doecho$idone一)for語句92*3.第三種格式:一)for語句92*二)until語句用來執(zhí)行一系列命令直到所指定的條件為真才能終止。在bash中,利用如下的格式:untilexpressiondostatementsdone93*二)until語句用來執(zhí)行一系列命令直到所指定的條件為真才1.9流程控制語句——二、循環(huán)語句3.while語句在bash中,利用的如下的格式:whileexpressiondostatementsdone94*1.9流程控制語句——二、循環(huán)語句3.while語句941.9流程控制語句——二、循環(huán)語句例:求前五個偶數(shù)的和bash的shell程序如下:95*1.9流程控制語句——二、循環(huán)語句例:求前五個偶數(shù)的和951.9流程控制語句——二、循環(huán)語句96*1.9流程控制語句——二、循環(huán)語句96*1.9流程控制語句——二、循環(huán)語句4.select語句select語句的格式如下:selectiteminitemlistdostatementsdoneitemlist是可選的,當(dāng)未給出itemlist時,系統(tǒng)通過item中的項目一次重復(fù)一個,但當(dāng)給出itemlist時,系統(tǒng)對itemlist中的每個項重復(fù),對每次重復(fù)把itemlist的當(dāng)前值賦給item,而后item可作為執(zhí)行語句的一部分。97*1.9流程控制語句——二、循環(huán)語句4.select語句91.9流程控制語句——二、循環(huán)語句如果編寫一個提供用戶挑選Continue或Finsh的選擇菜單,則可編寫如下的shell程序:
#!/bin/bashselectiteminContinueFinshdoif[$item=“Finsh”];thenbreakfidone
執(zhí)行select命令時,系統(tǒng)向用戶顯示一個選擇數(shù)字的菜單——在這種情況下:1表示Continue,2表示Finsh。當(dāng)用戶選擇1時,變量item包含值Continue;而當(dāng)用戶選擇2時,變量item包含值Finsh.。當(dāng)用戶選擇2時,即執(zhí)行if語句,并終止循環(huán)。98*1.9流程控制語句——二、循環(huán)語句如果編寫一個提供用戶挑選1.9流程控制語句——三、雜項語句雜項語句:1.shift語句2.break語句3.exit語句99*1.9流程控制語句——三、雜項語句雜項語句:99*1.9流程控制語句——三、雜項語句1.shift語句用來處理位置參數(shù),并從左到右每次處理一個參數(shù)。應(yīng)該記得,位置參數(shù)是用$1、$2、$3等來標(biāo)識的。shift命令的作用時,把每個位置參數(shù)向左移動一個位置,而當(dāng)前的$1丟失。shift命令的格式如下:shiftnumber參數(shù)number是移動的數(shù)目,是可選的。當(dāng)不特別指定number時,缺省值為1,即參數(shù)向左移動一個位置。當(dāng)指定number時,則向左移動number個位置。100*1.9流程控制語句——三、雜項語句1.shift語句101.9流程控制語句——三、雜項語句101*1.9流程控制語句——三、雜項語句101*1.9流程控制語句——三、雜項語句2.break語句用來終止重復(fù)執(zhí)行的循環(huán)。break通常在進(jìn)行一些處理后退出循環(huán)或case語句。如果是在一個嵌入循環(huán)里,可以指定跳出的循環(huán)個數(shù)。例如如果在兩層循環(huán)內(nèi),用break2剛好跳出整個循環(huán)。3.continue語句它不會跳出循環(huán),只是跳過這個循環(huán)步。102*1.9流程控制語句——三、雜項語句2.break語句11.10函數(shù)函數(shù)是shell程序中執(zhí)行特殊過程的部件,并在shell程序中可以重復(fù)調(diào)用。下面是在bash中函數(shù)定義格式。func(){statements}可以調(diào)用函數(shù)如下:funcparam1param2param3參數(shù)param1param2等是可以選擇的。還能把參數(shù)作為單字符串來傳送,例如$@。函數(shù)可以分析參數(shù),就好像它們是傳送給shell程序的位置參數(shù)。103*1.10函數(shù)函數(shù)是shell程序中執(zhí)行特殊過程的部件,并在1.10函數(shù)104*1.10函數(shù)104*4.10函數(shù)105*4.10函數(shù)105*1.10函數(shù)106*1.10函數(shù)106*1.10函數(shù)107*1.10函數(shù)107*1.10函數(shù)例:在傳送月份數(shù)字后顯示月份名或出錯信息。displaymonth(){case$1in*)echo”Invalidparameter”esac}displaymonth8
程序顯示如下:
MonthisAugust01|1)echo“MonthisJanuary”;;02|2)echo“MonthisFebruary”;;03|3)echo“MonthisMarch”;;04|4)echo“MonthisApril”;;05|5)echo“MonthisMay”;;06|6)echo“MonthisJune”;;07|7)echo“MonthisJuly”;;08|8)echo“MonthisAugust”;;09|9)echo“MonthisSeptember”;;10)echo“MonthisOctober”;;11)echo“MonthisNovember”;;12)echo“MonthisDecember”;;108*1.10函數(shù)例:在傳送月份數(shù)字后顯示月份名或出錯信息。01
Linux編程及應(yīng)用
主講:任繼平郵箱:109*Linux編程及應(yīng)用109*參考教材:linux軟件工程師(C語言)實用教程110*參考教材:linux軟件工程師(C語言)實用教程110*課程要求:111*課程要求:111*課程內(nèi)容:112*課程內(nèi)容:112*第1章Linux系統(tǒng)程序設(shè)計基礎(chǔ)113*第1章Linux系統(tǒng)程序設(shè)計基礎(chǔ)113*第1章Linux系統(tǒng)程序設(shè)計基礎(chǔ)114*第1章Linux系統(tǒng)程序設(shè)計基礎(chǔ)114*本章重點(diǎn)編輯、編譯及運(yùn)行Linuxc程序gcc編譯器的使用gdb調(diào)試器的使用115*本章重點(diǎn)編輯、編譯及運(yùn)行Linuxc程序115*1.1第一個Linuxc程序
例1-1:設(shè)計一個程序,要求在屏幕上輸出“這是第一個Linuxc程序!”。步驟1:設(shè)計編輯源程序代碼使用文本編輯器vim,在終端中輸出:[root@localhostroot]#vim1-1.c
輸入完成后存盤:按ESC鍵→輸入“:wq”回車
116*1.1第一個Linuxc程序例1-1:設(shè)計一個程序,要1.1第一個Linuxc程序步驟2:編譯程序查看當(dāng)前目錄下是否有1-1.c文件,輸入命令:
[root@localhostroot]#ls1-1.c編譯:[root@localhostroot]#gcc1-1.c-o1-1[root@localhostroot]#步驟3:運(yùn)行程序[root@localhostroot]#ls1-1.c1-1[root@localhostroot]#./1-1這是第一個Linuxc程序!117*1.1第一個Linuxc程序步驟2:編譯程序117*1.1第一個Linuxc程序Linux下的文本編輯器軟件主要有vim、gedit和Emacs,Linux下的c編譯器中,gcc是功能最強(qiáng)大、使用最廣泛的軟件。gcc編譯的常用格式為:gccC源文件-o目標(biāo)文件名或:gcc-o目標(biāo)文件名C源文件或:gcc目標(biāo)文件名最后一種情況目標(biāo)文件名默認(rèn)為:c.out118*1.1第一個Linuxc程序Linux下的文本編輯器軟件1.1第一個Linuxc程序printf函數(shù)說明思考題:設(shè)計一個程序,要求在屏幕上輸出:************119*1.1第一個Linuxc程序printf函數(shù)說明思考題1.2gcc編譯器gcc是(GNUCmpilerCollection的簡稱),它是GNU項目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc不僅功能十分強(qiáng)大,結(jié)構(gòu)也異常靈活。它可以通過不同的前端模塊來支持各種語言,如Java、Fortran、Pascal、Modula-3和Ada等。gcc是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比,平均效率要高20%~30%。gcc支持編譯的后綴名:120*1.2gcc編譯器gcc是(GNUCmpilerCo121*121*1.2.1使用gccgcc指令的一般格式為:gcc[參數(shù)]要編譯的文件[參數(shù)][目標(biāo)文件]例1-2:設(shè)計一個程序,要求把輸入的百分制的成績轉(zhuǎn)換成五級制輸出。即輸入成績大于等于90分,顯示“優(yōu)秀”;若成績介于80~90分,顯示“良好”;若成績介于70~80分,顯示“中等”;若成績介于60~70分,顯示“及格”;若成績小于60分,顯示“不及格”。 122*1.2.1使用gccgcc指令的一般格式為:122*1.2.1使用gcc步驟1:編輯源程序代碼
[root@localhostroot]#vim1-2.c123*1.2.1使用gcc步驟1:編輯源程序代碼123*1.2.1使用gcc步驟2:用gcc編譯程序[root@localhostroot]#gcc1-2.c–o1-2步驟3:運(yùn)行程序[root@localhostroot]#./1-2思考題:設(shè)計一個程序,要求輸入一個數(shù),如果此數(shù)大于0,顯示“輸入的為正數(shù)”,否則顯示“輸入的為負(fù)數(shù)”。124*1.2.1使用gcc步驟2:用gcc編譯程序思考題:設(shè)計1.2.2gcc編譯流程125*1.2.2gcc編譯流程125*1.2.2gcc編譯流程例1-3:設(shè)計一個程序,要求輸入兩個整數(shù),求和輸出。通過使用gcc的參數(shù),控制gcc的編譯過程,了解gcc的編譯過程,進(jìn)一步認(rèn)識gcc的靈活性。步驟1:編輯源程序代碼[root@localhostroot]#vim1-3.c126*1.2.2gcc編譯流程例1-3:設(shè)計一個程序,要求輸入兩127*127*1.2.2gcc編譯流程步驟2:預(yù)處理階段[root@localhostroot]#gcc1-3.c–o1-3.i–E[root@localhostroot]#vim1-3.i步驟3:編譯階段[root@localhostroot]#gcc1-3.i–o1-3.s–S[root@localhostroot]#vim1-3.s步驟4:匯編階段[root@localhostroot]#gcc1-3.s–o1-3.o–c128*1.2.2gcc編譯流程步驟2:預(yù)處理階段128*1.2.2gcc編譯流程步驟5:鏈接階段Linux系統(tǒng)把printf和scanf函數(shù)的實現(xiàn),都放在了libc.so.6的庫文件中。在沒有參數(shù)指定時,gcc到系統(tǒng)默認(rèn)的路徑“/usr/lib”下查找,鏈接到libc.so.6庫函數(shù)中去,這樣就有了printf和scanf函數(shù)的實現(xiàn)部分。把程序中一些函數(shù)的實現(xiàn),這是鏈接階段的工作。完成鏈接后,gcc就可以生成可執(zhí)行程序文件
注意:gcc在編譯的時候默認(rèn)使用動態(tài)鏈接庫,編譯鏈接時并不把庫文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行的時候動態(tài)加載鏈接庫,這樣可以節(jié)省系統(tǒng)開銷。129*1.2.2gcc編譯流程步驟5:鏈接階段注意:gcc在編1.2.2gcc編譯流程scanf函數(shù)說明130*1.2.2gcc編譯流程scanf函數(shù)說明130*1.2.3gcc編譯器的主要參數(shù)1.總體參數(shù)當(dāng)頭文件與gcc不在同一目錄下要用-Idir編譯,它是指頭文件,而添加庫文件時需用-Ldir參數(shù)。131*1.2.3gcc編譯器的主要參數(shù)1.總體參數(shù)當(dāng)頭文件與g1.2.3gcc編譯器的主要參數(shù)例1-4:設(shè)計一個程序,要求把輸入的字符串原樣輸出,程序中的頭文件自己定義,源程序文件為“1-4.c”,自定義的頭文件為“my.h”,放在目錄“/root”下。步驟1:設(shè)計編輯源程序代碼1-4.c[root@localhostroot]#vim1-4.c132*1.2.3gcc編譯器的主要參數(shù)例1-4:設(shè)計一個程序,要1.2.3gcc編譯器的主要參數(shù)步驟2:設(shè)計編輯自定義的頭文件my.h[root@localhostroot]#vimmy.h步驟3:正常編譯1-4.c文件:[root@localhostroot]#gcc1-4.c–o1-4編譯器提示出錯。133*1.2.3gcc編譯器的主要參數(shù)步驟2:設(shè)計編輯自定義的注意:在include語句中,“<>”表示在默認(rèn)路徑“/usr/include”中搜索頭文件,引號“”
””表示在本目錄中搜索。因此,前面例子中把1-3.c中的“#include<my.h>”改成“#include“my.h””,就不需要“-Idir”參數(shù)也能正確編譯了。步驟4:加“-Idir”參數(shù)編譯:[root@localhostroot]#gcc1-4.c–o1-4–I/root134*注意:在include語句中,“<>”表示在默認(rèn)路徑“/us1.2.3gcc編譯器的主要參數(shù)getchar函數(shù)說明135*1.2.3gcc編譯器的主要參數(shù)getchar函數(shù)說明11.2.3gcc編譯器的主要參數(shù)putchar函數(shù)說明思考題:此例能不能用前面的printf函數(shù)和scanf函數(shù)?如果可以,要如何改寫程序?136*1.2.3gcc編譯器的主要參數(shù)putchar函數(shù)說明思1.2.3gcc編譯器的主要參數(shù)例1-5:有程序1-5.c用到目錄“/root/lib”下的一個動態(tài)庫libsunq.so。[root@localhostroot]#gcc1-5.c–o1-5.c–L/root/lib–lsunqLinux下的庫文件命名時有一個規(guī)定:必須以l、i、b三個字母開頭,因此,在用“-l”指定鏈接庫文件時可以省去l、i、b三個字母。也就是說“-llibsunq”有時候?qū)懗伞?lsunq”。 137*1.2.3gcc編譯器的主要參數(shù)例1-5:有程序1-5.c1.2.3gcc編譯器的主要參數(shù)例1-6:設(shè)計一個程序,要求把輸入的數(shù)字作為X軸坐標(biāo),算出它的sin值。步驟1:編輯源程序代碼[root@localhostroot]#vim1-6.c138*1.2.3gcc編譯器的主要參數(shù)例1-6:設(shè)計一個程序,要1.2.3gcc編譯器的主要參數(shù)步驟2:用gcc編譯程序[root@localhostroot]#gcc1-6.c–o1-6結(jié)果發(fā)現(xiàn)編譯器報錯:原因是需要指定函數(shù)的具體路徑,要查找函數(shù)sin,輸入:[root@localhostroot]#nm-o/lib/*.so|grepsin139*1.2.3gcc編譯器的主要參數(shù)步驟2:用gcc編譯程序1.2.3gcc編譯器的主要參數(shù)在/lib/libm-2.3.2.so:00008610Wsin中除去函數(shù)庫頭lib及函數(shù)的版本號-2.3.2,所余下的符號為“m”,在編譯時用字符“l(fā)”與余下的符號“m”相連接成“l(fā)m”,在編譯時加上此參數(shù)就能正確地通過編譯,即:[root@localhostroot]#gcc1-6.c–o1-6-lm步驟3:運(yùn)行程序[root@localhostroot]#./1-6注意:Linux下動態(tài)鏈接庫默認(rèn)后綴名“.so”,靜態(tài)鏈接庫默認(rèn)后綴名“.a”。140*1.2.3gcc編譯器的主要參數(shù)在/lib/libm-2.1.2.3gcc編譯器的主要參數(shù)gcc的常用告警和出錯參數(shù)141*1.2.3gcc編譯器的主要參數(shù)gcc的常用告警和出錯參數(shù)1.2.3gcc編譯器的主要參數(shù)例1-7:設(shè)計一個程序,要求打印“這是一段用于測試的垃圾程序!”,里面包含一些非標(biāo)準(zhǔn)語法。步驟1:設(shè)計編輯源程序代碼
[root@localhostroot]#vim1-7.c
142*1.2.3gcc編譯器的主要參數(shù)例1-7:設(shè)計一個程序,要步驟2:關(guān)閉所有告警[root@localhostroot]#gcc1-7.c–o1-7–w步驟3:顯示不符合ANSIc標(biāo)準(zhǔn)語法的告警信息[root@localhostroot]#gcc1-7.c–o1-7–ansi步驟4:
允許發(fā)出ANSIc標(biāo)準(zhǔn)所列的全部警告信息[root@localhostroot]#gcc1-7.c–o1-7–pedantic步驟5:允許發(fā)出gcc提供的所有有用的告警信息[root@localhostroot]#gcc1-7.c–o1-7–Wall143*步驟2:關(guān)閉所有告警143*1.2.3gcc編譯器的主要參數(shù)優(yōu)化參數(shù)代碼優(yōu)化指的是編譯器通過分析源代碼,找出其中尚未達(dá)到最優(yōu)的部分,然后對其重新進(jìn)行組合,目的是改善程序的執(zhí)行性能。gcc提供的代碼優(yōu)化功能非常強(qiáng)大,它通過編譯參數(shù)“-On”來控制優(yōu)化代碼的生成,其中n是一個代表優(yōu)化級別的整數(shù)。通常來說,數(shù)字越大優(yōu)化的等級越高,同時也就意味著程序的運(yùn)行速度越快。144*1.2.3gcc編譯器的主要參數(shù)優(yōu)化參數(shù)144*1.2.3gcc編譯器的主要參數(shù)例1-8:設(shè)計一個程序,要求循環(huán)8億次左右,每次都有一些可以優(yōu)化的加減乘除運(yùn)算。比較gcc的編譯參數(shù)“-On”優(yōu)化程序前后的運(yùn)行速度。步驟1:編輯源程序代碼:145*1.2.3gcc編譯器的主要參數(shù)例1-8:設(shè)計一個程序,要步驟2:不加任何優(yōu)化參數(shù)進(jìn)行編譯。[root@localhostroot]#gcc1-8.c–o1-8步驟3:用time命令大致統(tǒng)計出該程序在運(yùn)行時所需要的時間。[root@localhostroot]#time./1-8步驟4:加“-O2”優(yōu)化參數(shù)進(jìn)行編譯。[root@localhostroot]#gcc1-8.c–o1-8–O2步驟5:再統(tǒng)計優(yōu)化后的程序運(yùn)行時所需要的時間。[root@localhostroot]#time./1-8步驟6:對比兩次執(zhí)行的輸出結(jié)果。146*步驟2:不加任何優(yōu)化參數(shù)進(jìn)行編譯。146*1.2.3gcc編譯器的主要參數(shù)優(yōu)化雖然能夠給程序帶來更好的執(zhí)行性能,但在一些場合中應(yīng)該避免優(yōu)化代碼。程序開發(fā)的時候。資源受限的時候。跟蹤調(diào)試的時候。147*1.2.3gcc編譯器的主要參數(shù)優(yōu)化雖然能夠給程序帶來更好1.3gdb調(diào)試器1.gdb概述Linux下的gdb調(diào)試器,是一款GNU組織開發(fā)并發(fā)布的UNIX/Linux下的程序調(diào)試工具。它沒有圖形化的友好界面,但功能強(qiáng)大。在進(jìn)行應(yīng)用程序的調(diào)試之前,要注意的是gdb進(jìn)行調(diào)試的是可執(zhí)行文件,而不是如“.c”這樣的源代碼文件。因此,需要先通過gcc編譯生成可執(zhí)行文件才能用gdb進(jìn)行調(diào)試。148*1.3gdb調(diào)試器1.gdb概述148*1.3gdb調(diào)試器2.使用gdb調(diào)試程序例1-9:設(shè)計一個程序,要求輸入兩個整數(shù),判斷并輸出其中的最小數(shù)。步驟1:編輯源程序代碼:
149*1.3gdb調(diào)試器2.使用gdb調(diào)試程序149*150*150*1.3gdb調(diào)試器步驟2:
用gcc編譯程序[root@localhostroot]#gcc1-9.c–o1-9–g步驟3:
進(jìn)入gdb調(diào)試環(huán)境[root@localhostroot]#gdb1-9注意:gdb是命令行調(diào)試環(huán)境,調(diào)試程序都在提示符“(gdb)”后輸入相應(yīng)的命令,gdb的命令很多,可以在提示符“(gdb)”后輸入help進(jìn)行查找。常用的gdb命令151*1.3gdb調(diào)試器步驟2:用gcc編譯程序注意:gdb1.3gdb調(diào)試器步驟4:
用gdb調(diào)試程序(1)查看源文件在gdb中輸入“l(fā)”(list)就可以查看程序源代碼,一次顯示10行;注意:gdb命令“l(fā)”(list)列出源代碼的時候,要確保原來的源程序還在,如果讀者以為這象反匯編一樣給出代碼,那就錯了,其實只是列出源文件的內(nèi)容。
特別提示:“l(fā)ist”+行號:查看指定位置的代碼,如“l(fā)ist1”就是從第一行開始列出源代碼。(2)設(shè)置斷點(diǎn)在gdb中設(shè)置斷點(diǎn)命令是“b”(break),后面跟行號或者函數(shù)名。如:(gdb)b10152*1.3gdb調(diào)試器步驟4:用gdb調(diào)試程序注意:gdb1.3gdb調(diào)試器(3)查看斷點(diǎn)信息用命令“infob”(infobreak)查看斷點(diǎn)信息。注意:gdb在一個程序中可以設(shè)置多個斷點(diǎn),有多個斷點(diǎn)中斷時,“Num”處顯示斷點(diǎn)序號。(4)運(yùn)行程序:輸入“r”(run)開始運(yùn)行程序。注意:gdb默認(rèn)從第一行開始運(yùn)行,如果要從程序中指定行開始運(yùn)行,只需輸入“r”+行號。(5)查看變量值程序運(yùn)行到斷點(diǎn)處會自動暫停,輸入“p變量名”153*1.3gdb調(diào)試器(3)查看斷點(diǎn)信息注意:gdb在一個程序1.3gdb調(diào)試器調(diào)試程序時,可能需要修改變量值,程序運(yùn)行到斷點(diǎn)處時,輸入“set變量=設(shè)定值”,例如給變量“a2”賦值11,輸入“seta2=11”。gdb在顯示變量值時都會在對應(yīng)值前加“$n”標(biāo)記,它是當(dāng)前變量值的引用標(biāo)記,以后想再引用此變量,可以直接使用“$n”,提高了調(diào)試效率。注意:查看變量值,不能在程序結(jié)束后。154*1.3gdb調(diào)試器調(diào)試程序時,可能需要修改變量值,程序運(yùn)行(6)單步運(yùn)行在斷點(diǎn)處輸入“n”(next)或者“s”(step)。它們之間的區(qū)別在于:若有函數(shù)調(diào)用時,“s”會進(jìn)入該函數(shù)而“n”不會進(jìn)入該函數(shù)。(7)繼續(xù)運(yùn)行程序輸入“c”(continue)命令恢復(fù)程序的正常運(yùn)行,把剩余的程序執(zhí)行完,并顯示執(zhí)行結(jié)果。(8)退出gdb環(huán)境:輸入“q”(quit)命令。思考題:此例中,如果比較的結(jié)果剛好相反,應(yīng)該把斷點(diǎn)設(shè)置在第幾行?調(diào)試的時候還需要注意什么才能看出變量的值?155*(6)單步運(yùn)行思考題:此例中,如果比較的結(jié)果剛好相反,應(yīng)該把思考與實驗編寫一個簡單的c語言程序:輸出兩行文字“Linux下的c也不是太難嘛!”,在Linux下編輯、編譯、運(yùn)行。編寫一個簡單的c語言程序:根據(jù)輸入的兩個整數(shù)求平均值并且在終端輸出,通過gcc編譯器得到它的匯編程序文件。用gdb調(diào)試器調(diào)試上面第2題的程序,查看程序執(zhí)行每一步變量的值,熟悉gdb的使用流程。編寫一個c語言程序:打印輸出所有“水仙花數(shù)”,用gdb調(diào)試程序(給出步驟,至少十步以上)。所謂“水仙花數(shù)”是指一個3位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是一水仙花數(shù),因為153=13+53+33。156*思考與實驗編寫一個簡單的c語言程序:輸出兩行文字“Linux第2章文件分割和多文件編譯157*第2章文件分割和多文件編譯157*本章重點(diǎn)函數(shù)編寫與函數(shù)參數(shù)的傳遞多文件系統(tǒng)多文件系統(tǒng)中使用make使用autotools158*本章重點(diǎn)函數(shù)編寫與函數(shù)參數(shù)的傳遞158*2.1函數(shù)函數(shù)指功能相對獨(dú)立,由一系列語句組成的模塊,它的目的有:當(dāng)設(shè)計一個大型程序時,如果能夠?qū)⑦@個程序依照功能,將其分割成較小的功能,然后依據(jù)這些小功能的要求編寫函數(shù),可以使程序簡單化,同時也會使最后檢查錯誤變得容易。在一個程序中,會產(chǎn)生指令重復(fù)使用多次的問題,將這些重復(fù)使用的指令編寫成一個函數(shù),需要時加以調(diào)用,可以提高編程效率,也可以使程序精簡。159*2.1函數(shù)函數(shù)指功能相對獨(dú)立,由一系列語句組成的模塊,它的2.1.1函數(shù)簡介C語言函數(shù)可分為庫函數(shù)和用戶定義函數(shù):庫函數(shù):由C系統(tǒng)提供,用戶無須定義,也不必在程序中作類型說明,只需在程序前包含有該函數(shù)原型的頭文件即可在程序中直接調(diào)用。用戶自定義函數(shù):由用戶按需要編寫的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,在很多情況下還必須對該函數(shù)進(jìn)行原型說明,然后才能使用。160*2.1.1函數(shù)簡介C語言函數(shù)可分為庫函數(shù)和用戶定義函數(shù):12.1.1函數(shù)簡介例2-1:設(shè)計一個程序,要求在屏幕上打印輸出五行“Linux程序設(shè)計,有點(diǎn)意思!”的字符串。步驟1:編輯源程序代碼;步驟2:用gcc編譯程序[root@localhostroot]#gcc2-1.c–o2-1步驟3:運(yùn)行程序[root@localhostroot]#./2-1161*2.1.1函數(shù)簡介例2-1:設(shè)計一個程序,要求在屏幕上打印2.1.1函數(shù)簡介162*2.1.1函數(shù)簡介162*2.1.1函數(shù)簡介在c語言中,所有的函數(shù)定義都是平行的。即在一個函數(shù)的函數(shù)體內(nèi),不能再定義另一個函數(shù),。但是函數(shù)之間允許相互調(diào)用,也允許嵌套調(diào)用。習(xí)慣上把調(diào)用者稱為主調(diào)函數(shù)。函數(shù)還可以自己調(diào)用自己,稱為遞歸調(diào)用。函數(shù)的一般形式:函數(shù)類型函數(shù)名(形參類型:形式參數(shù)1,形參類型:形式參數(shù)2,……){類型說明;語句;}163*2.1.1函數(shù)簡介在c語言中,所有的函數(shù)定義都是平行的。即2.1.2返回值函數(shù)調(diào)用時,主調(diào)函數(shù)把實參的值傳送給被調(diào)函數(shù)的形參,從而實現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。函數(shù)調(diào)用中數(shù)據(jù)傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,并不會影響到實參。函數(shù)運(yùn)行結(jié)束,如果被調(diào)函數(shù)的結(jié)果需要傳遞回主調(diào)函數(shù),通常用用return完成這項任務(wù),叫函數(shù)的返回值。164*2.1.2返回值函數(shù)調(diào)用時,主調(diào)函數(shù)把實參的值傳送給被調(diào)函2.1.2返回值例2.2:設(shè)計一個程序,要求編寫函數(shù)max,有兩個參數(shù),返回兩個數(shù)中的最大值給主函數(shù)。步驟1:編輯源程序代碼步驟2:用gcc編譯程序
[root@localhostroot]#gcc2-2.c–o2-2步驟3:運(yùn)行程序[root@localhostroot]#./2-2思考題:如果把此例中的數(shù)據(jù)傳遞改成指針傳送,程序應(yīng)該如何設(shè)計?165*2.1.2返回值例2.2:設(shè)計一個程序,要求編寫函數(shù)max166*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 展廳展示手機(jī)合同模板
- 叉車裝貨合同范例
- 剩余瓷磚售賣合同范例
- 房屋認(rèn)購意向合同范例
- 擔(dān)保物權(quán)合同模板
- 扣款合同模板
- 工具銷售合同范例
- 嬰兒衣服租用合同范例
- 代建租賃住房合同范例
- 中國華能集團(tuán)公司水力發(fā)電廠勵磁系統(tǒng)監(jiān)督技術(shù)標(biāo)準(zhǔn)
- 實驗室消毒培訓(xùn)課件
- 化工勞動紀(jì)律培訓(xùn)課件
- 中醫(yī)培訓(xùn)課件:《拔罐技術(shù)》
- 筋傷概論-骨傷科
- 惠安女課件完
- 鹽酸采購和儲存和使用安全管理
- 2022信息安全技術(shù)服務(wù)器安全技術(shù)要求和測評準(zhǔn)則
- 健身及體育運(yùn)動服務(wù)領(lǐng)域:第一體育企業(yè)組織架構(gòu)及部門職責(zé)
- 安全保衛(wèi)常識課件
- 乳腺癌放療后的皮膚護(hù)理課件
- 《培訓(xùn)與開發(fā) 》課件
評論
0/150
提交評論