嵌入式系統(tǒng)原理與應(yīng)用 課件 第8、9章 Linux下的Shell命令與編程、Linux下程序設(shè)計(jì)工具_(dá)第1頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 課件 第8、9章 Linux下的Shell命令與編程、Linux下程序設(shè)計(jì)工具_(dá)第2頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 課件 第8、9章 Linux下的Shell命令與編程、Linux下程序設(shè)計(jì)工具_(dá)第3頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 課件 第8、9章 Linux下的Shell命令與編程、Linux下程序設(shè)計(jì)工具_(dá)第4頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用 課件 第8、9章 Linux下的Shell命令與編程、Linux下程序設(shè)計(jì)工具_(dá)第5頁(yè)
已閱讀5頁(yè),還剩151頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式系統(tǒng)原理與設(shè)計(jì)第8章Linux下的Shell命令與編程第八章01020304基本概念常用Shell命令Shell編程基礎(chǔ)Shell編程的控制語(yǔ)句/01基本概念Shell簡(jiǎn)介1.什么是ShellLinux系統(tǒng)中,Shell就是套在操作系統(tǒng)內(nèi)核外面的一層殼。正因?yàn)镾hell的存在,才向普通用戶(hù)隱藏了許多關(guān)于操作系統(tǒng)內(nèi)核的細(xì)節(jié),方便了用戶(hù)使用計(jì)算機(jī)。2.Shell的功能Shell的基本功能是進(jìn)行命令解釋和執(zhí)行,用來(lái)接收用戶(hù)輸入的命令,并傳遞給操作系統(tǒng)。Shell的擴(kuò)展功能是一種程序設(shè)計(jì)語(yǔ)言,利用Shell規(guī)定的語(yǔ)法,可以設(shè)計(jì)出各種功能的程序來(lái)更方便的管理或使用計(jì)算機(jī)。Shell簡(jiǎn)介Shell的版本BourneShell:簡(jiǎn)稱(chēng)sh,該Shell由SteveBourne在貝爾實(shí)驗(yàn)室時(shí)編寫(xiě)。Bourne-AgainShell:簡(jiǎn)稱(chēng)bash,該Shell由BrianFox編寫(xiě),是絕大多數(shù)GNULinux發(fā)行版的默認(rèn)Shell。CShell:簡(jiǎn)稱(chēng)csh,該Shell由Billjoy在BSD系統(tǒng)上開(kāi)發(fā),由于其語(yǔ)法類(lèi)似于C語(yǔ)言,因此稱(chēng)為CShell。ZShell:Thelastshellyou’lleverneed!Z是最后一個(gè)字母,也就是終極Shell。它集成bash、csh的重要特性,同時(shí)又增加了獨(dú)有的特性。Shell簡(jiǎn)介Shell編程的應(yīng)用場(chǎng)景在嵌入式系統(tǒng)開(kāi)發(fā)過(guò)程中,以下場(chǎng)景都可以通過(guò)Shell編程簡(jiǎn)化工作:將一些復(fù)雜的命令簡(jiǎn)單化。例如:在GitHub上提交一次代碼需要很多步驟,但是用Shell之后就可以簡(jiǎn)化成一步。在項(xiàng)目開(kāi)發(fā)中,通過(guò)腳本自動(dòng)實(shí)現(xiàn)更新最新的軟件開(kāi)發(fā)工具包(SDK)。能夠批量處理,大部分操作過(guò)程位于后臺(tái),不需要用戶(hù)進(jìn)行干預(yù)。自動(dòng)打包、編譯、發(fā)布等功能。Linux下目錄與路徑Linux系統(tǒng)中,目錄就是描述所有文件信息的樹(shù)型結(jié)構(gòu),如圖所示。Work目錄(工作目錄)Home目錄(家目錄)Linux下目錄與路徑

路徑指從樹(shù)型目錄中的某個(gè)節(jié)點(diǎn)(起點(diǎn))到另一個(gè)節(jié)點(diǎn)(終點(diǎn))經(jīng)過(guò)的節(jié)點(diǎn)次序,起點(diǎn)節(jié)點(diǎn)一般為目錄,終點(diǎn)節(jié)點(diǎn)可以為目錄或文件。節(jié)點(diǎn)和節(jié)點(diǎn)之間用“/”分開(kāi)。絕對(duì)路徑絕對(duì)路徑是指從“根目錄”開(kāi)始到達(dá)某個(gè)節(jié)點(diǎn)的路徑,也稱(chēng)為完全路徑。相對(duì)路徑相對(duì)路徑是從某節(jié)點(diǎn)開(kāi)始到其子節(jié)點(diǎn)的路徑。Linux下的用戶(hù)Linux是多用戶(hù)操作系統(tǒng),多個(gè)用戶(hù)可以同時(shí)登錄進(jìn)行操作。超級(jí)用戶(hù)指的是root用戶(hù),它是Linux默認(rèn)的系統(tǒng)管理員,擁有管理計(jì)算機(jī)的全部權(quán)限。普通用戶(hù)指的是權(quán)限受限的其它用戶(hù)。Linux系統(tǒng)中,每個(gè)文件、目錄和進(jìn)程,都?xì)w屬于某一個(gè)用戶(hù)。通常而言,每個(gè)普通用戶(hù)只能操作屬于自己的文件、目錄和進(jìn)程,操作其他用戶(hù)的文件、目錄和進(jìn)程需要得到別的用戶(hù)的許可。例:顯示文件的詳細(xì)信息后,可以看到Linux下文件的權(quán)限、用戶(hù)的對(duì)應(yīng)關(guān)系

2408949-rwxr-xr-x1rootroot704-2112:47lsfile.sh

2408260drwxr-xr-x2rootroot4.0K04-2122:15mydir/02常用Shell命令目錄和文件操作命令目錄和文件操作命令改變目錄:cdcd(ChangeDirectory)命令用于在Linux文件系統(tǒng)的不同目錄之間切換。列出目錄內(nèi)容:lsls命令是list的簡(jiǎn)化形式,ls的命令選項(xiàng)非常多,下邊只討論一些最常用的選項(xiàng)。-a:顯示所有文件及目錄;-l:除文件名稱(chēng)外,亦將文件類(lèi)型、權(quán)限、擁有者、文件大小等信息詳細(xì)列出;-r:將文件以相反次序顯示(原定依英文字母次序);-t:將文件依建立時(shí)間之先后次序列出;-i:顯示文件的inode號(hào);-A:同-a,但不列出"."(當(dāng)前目錄)及".."(父目錄);-F:在列出的文件名稱(chēng)后加一符號(hào),指示文件類(lèi)型;例如可執(zhí)行文件則加"*",目錄則加"/",鏈接文件后加"@"。2408949-rwxr-xr-x1rootroot704-2112:47lsfile.sh

第一字段:inode(索引節(jié)點(diǎn))

第二字段:文件種類(lèi)(-)和權(quán)限(rwx,共9位,分別控制文件屬主、用戶(hù)組以及其它用戶(hù)的權(quán)限);

第三字段:硬鏈接個(gè)數(shù);

第四字段:屬主;

第五字段:所歸屬的組;

第六字段:文件或目錄的大小(字節(jié));

第七字段和第八字段:最后訪(fǎng)問(wèn)或修改時(shí)間;

第九字段:文件名或目錄名文件類(lèi)型:-:常規(guī)文件d:目錄l:鏈接文件b:塊特殊設(shè)備c:字符特殊設(shè)備目錄和文件操作命令顯示當(dāng)前目錄:pwdpwd(PrintWorkDirectory)命令會(huì)顯示當(dāng)前所在的位置,即工作目錄。創(chuàng)建和刪除目錄:mkdir和rmdirmkdir:創(chuàng)建一個(gè)或多個(gè)目錄。rmdir:刪除一個(gè)或多個(gè)空目錄。目錄必須是空目錄,否則會(huì)指出這不是一個(gè)空目錄,刪除失敗。復(fù)制文件或目錄:cpcp[選項(xiàng)]源文件目標(biāo)文件cp[選項(xiàng)]源文件組目標(biāo)目錄目錄和文件操作命令移動(dòng)或更名:mvmv[-f][-i]文件1文件2 #文件1是源文件,改名操作mv[-f][-i]目錄1目錄2 #目錄1是源目錄,移動(dòng)目錄操作mv[-f][-i]文件列表目錄

#移動(dòng)一組文件到目標(biāo)目錄下刪除文件:rmrm[選項(xiàng)]文件列表rm-rf* #遞歸刪除當(dāng)前目錄下的所有文件和子目錄目錄和文件操作命令創(chuàng)建鏈接:lnln[選項(xiàng)]目標(biāo)[鏈接名]ln[選項(xiàng)]目標(biāo)目錄ln命令用于在文件之間創(chuàng)建鏈接,實(shí)際上是給系統(tǒng)中已有的某個(gè)文件指定另一個(gè)可用于訪(fǎng)問(wèn)它的名稱(chēng)。默認(rèn)情況下,ln產(chǎn)生的是硬鏈接,若需要?jiǎng)?chuàng)建軟鏈接則用參數(shù)-s。鏈接文件鏈接是一種在共享文件和訪(fǎng)問(wèn)它的用戶(hù)的若干目錄項(xiàng)之間建立聯(lián)系的一種方法。對(duì)一個(gè)目錄下的該文件進(jìn)行修改,就可以完成對(duì)所有目錄下同名鏈接文件的修改。對(duì)某個(gè)文件的各鏈接文件,可以給它們指定不同的權(quán)限,以控制對(duì)信息的共享和增強(qiáng)安全性。文件的鏈接有兩種形式:硬鏈接和符號(hào)鏈接(軟鏈接)。硬鏈接:硬鏈接是文件的一個(gè)拷貝,其i節(jié)點(diǎn)號(hào)是一樣的。但比復(fù)制有優(yōu)勢(shì),復(fù)制只是一個(gè)簡(jiǎn)單的拷貝,是靜態(tài)的;而硬鏈接不但是拷貝,而且是動(dòng)態(tài)和資源共享的。不能對(duì)目錄文件創(chuàng)建硬鏈接(root用戶(hù)除外);不能在不同的文件系統(tǒng)之間做硬鏈接。軟鏈接:符號(hào)鏈接也稱(chēng)軟鏈接,是一個(gè)新文件。符號(hào)鏈接類(lèi)似于windows的快捷方式,符號(hào)鏈接實(shí)際上是特殊文件的一種。在符號(hào)鏈接中,文件實(shí)際上是一個(gè)文本文件,其中包含有另一個(gè)文件的位置信息。硬鏈接和軟鏈接的區(qū)別符號(hào)鏈接是一個(gè)新文件,具有自己的I節(jié)點(diǎn)號(hào);硬鏈接沒(méi)有建立新文件,其只是一個(gè)指針。符號(hào)鏈接沒(méi)有硬鏈接的限制,可以對(duì)目錄文件建立符號(hào)鏈接,也可以在不同文件系統(tǒng)之間建立符號(hào)鏈接。當(dāng)源文件被刪除后,硬鏈接文件同樣可以被使用,而符號(hào)鏈接文件將無(wú)法使用。符號(hào)鏈接會(huì)顯示為“鏈接文件名->指向的實(shí)際文件”,而硬鏈接通過(guò)文件名無(wú)法判斷。例:硬鏈接和軟鏈接具體實(shí)例。

$ls-lie1.sh #顯示e1.sh文件的具體信息 403542-rw-r--r--1hllhll602019-11-0401:05e1.sh$lne1.she1_hard.sh #給e1.sh創(chuàng)建一個(gè)硬鏈接文件e1_hard.sh$ln-se1.she1_soft.sh #給e1.sh創(chuàng)建一個(gè)軟鏈接文件e1_soft.sh$ls-lie1* #顯示e1*文件的具體信息 403542-rw-r--r--2hllhll602019-11-0401:05e1_hard.sh 403542-rw-r--r--2hllhll602019-11-0401:05e1.sh 403553lrwxrwxrwx1hllhll52019-11-1104:14e1_soft.sh->e1.sh$cate1_soft.sh #顯示e1_soft.sh文件內(nèi)容 ThisisthesourcefileoftheHardlinkfileorSoftlinkfile.$cate1_hard.sh #顯示e1_hard.sh文件內(nèi)容 ThisisthesourcefileoftheHardlinkfileorSoftlinkfile.目錄和文件操作命令修改文件權(quán)限:chmod該命令用于改變文件的訪(fǎng)問(wèn)許可,但是符號(hào)鏈接除外chmod[選項(xiàng)]文件和目錄列表設(shè)置權(quán)限的兩種方式:使用字符串設(shè)置權(quán)限使用八進(jìn)制數(shù)設(shè)置權(quán)限用戶(hù)類(lèi)型包括:屬主用戶(hù)user

組用戶(hù)(即文件屬主用戶(hù)所在的組)group

其它用戶(hù)other許可類(lèi)型包括:

讀read,r寫(xiě)write,w

執(zhí)行execute,x使用字符串設(shè)置權(quán)限chmodu+re1.sh#給用戶(hù)設(shè)置文件e1.sh的r權(quán)限chmodugo+rwe1.sh#給用戶(hù)、同組用戶(hù)、其他用戶(hù)設(shè)置文件e1.sh的rw權(quán)限用戶(hù)類(lèi)型:u表示“用戶(hù)(user)”g表示“同組(group)用戶(hù)”

o表示“其他(others)用戶(hù)”

a表示“所有(all)用戶(hù)”chmod用戶(hù)類(lèi)型+/-許可的種類(lèi)使用八進(jìn)制數(shù)設(shè)置權(quán)限執(zhí)行權(quán)、寫(xiě)權(quán)和讀權(quán)所對(duì)應(yīng)的數(shù)值分別是1,2和4??梢杂眠@幾位數(shù)進(jìn)行任意組合,例如:若要rwx屬性則4+2+1=7;

若要rw-屬性則4+2=6;

若要r-x屬性則4+1=5。chmod4e1.sh #給用戶(hù)設(shè)置了文件e1.sh的r權(quán)限chmod666e1.sh #給用戶(hù)、同組用戶(hù)、其他用戶(hù)設(shè)置了文件exa2-4的rw權(quán)限目錄和文件操作命令

chattr[-RV][+-=acdijsuADS]文件或目錄名+表示增加某項(xiàng)屬性,-表示取消某項(xiàng)屬性,=設(shè)置文件或目錄只具有哪些屬性;

-R遞歸設(shè)置指定目錄及其目錄下的所有文件和子目錄的屬性;

-V詳細(xì)顯示目錄和文件的屬性設(shè)置情況。

a屬性:只允許向文件追加數(shù)據(jù),不允許任何進(jìn)程覆蓋重寫(xiě)文件的內(nèi)容。

A屬性:設(shè)置不允許系統(tǒng)更新文件的最后訪(fǎng)問(wèn)時(shí)間

i屬性:不可修改屬性。具有該屬性的文件不能被刪除、更名或修改其內(nèi)容。10.設(shè)置文件的擴(kuò)展屬性chattr

c屬性:壓縮屬性,寫(xiě)入或讀取時(shí),系統(tǒng)會(huì)自動(dòng)進(jìn)行壓縮或解壓縮。

s屬性:安全刪除屬性。即在刪除一個(gè)文件時(shí),會(huì)使用0填充原文件所在的存貯區(qū),以使恢復(fù)工具無(wú)法恢復(fù)出文件的內(nèi)容。

u屬性:可恢復(fù)性的刪除。對(duì)于具有該屬性的文件,在刪除時(shí),系統(tǒng)會(huì)保留其數(shù)據(jù)塊以便以后能恢復(fù)該文件的內(nèi)容例如:若要給/etc/rc.local文件增加不可修改屬性,則實(shí)現(xiàn)命令為:chattr+i/etc/rc.local若要取消i屬性,則實(shí)現(xiàn)命令為:chattr-i/etc/rc.local查看文件的擴(kuò)展屬性lsattr查看文件的擴(kuò)展屬性使用lsattr命令,命令用法:

lsattr[-adR]文件名或目錄名

-a 列出目錄中的所有文件(包括隱藏文件)。

-d 以與文件相同的方式列出目錄的擴(kuò)展屬性。

-R 以遞歸的方式列出目錄的屬性及其內(nèi)容。例如,若將/etc/rc.local文件設(shè)置為具有i屬性和A屬性,并查看設(shè)置后的屬性,其實(shí)現(xiàn)命令為:

[root@RHEL5~]#chattr=iA/etc/rc.local

[root@RHEL5~]#lsattr/etc/rc.local

----i--A-----/etc/rc.local用戶(hù)管理命令用戶(hù)管理命令添加用戶(hù)命令:useradd修改用戶(hù)密碼:passwduseradd[選項(xiàng)]用戶(hù)名passwd[選項(xiàng)]用戶(hù)名$useraddjack#創(chuàng)建的是“三無(wú)”用戶(hù),無(wú)家目錄,無(wú)密碼,無(wú)系統(tǒng)Shell$grepjack/etc/passwd#查看jack用戶(hù)信息 jack:x:1003:1003::/home/jack:/bin/sh#顯示jack用戶(hù)創(chuàng)建成功$ls/home yybhll #但是,在home目錄下無(wú)jack家目錄$useradd-m-s/bin/bash-d/home/jack1jack1$passwdjack#修改用戶(hù)jack的密碼 EnternewUNIXpassword:#輸入密碼時(shí),屏幕不會(huì)顯示任何信息 RetypenewUNIXpassword: passwd:passwordupdatedsuccessfully用戶(hù)管理命令修改用戶(hù)信息:usermod修改用戶(hù)密碼狀態(tài):chageusermod[選項(xiàng)]用戶(hù)名chage[選項(xiàng)]用戶(hù)名$grepjack/etc/passwd#查看修改前的用戶(hù)信息jack:x:1001:1001::/home/jack:#usermod-lmikejack#grepmike/etc/passwd#查看修改后的用戶(hù)信息mike:x:1001:1001::/home/jack:#chage-ljackLastpasswordchange :Nov11,2019Passwordexpires

:neverPasswordinactive :neverAccountexpires :neverMinimumnumberofdaysbetweenpasswordchange :0Maximumnumberofdaysbetweenpasswordchange :99999Numberofdaysofwarningbeforepasswordexpires :7用戶(hù)管理命令刪除用戶(hù)命令:userdel查看用戶(hù)id命令:id刪除系統(tǒng)中已有的用戶(hù),該命令的格式如下:userdel[選項(xiàng)]用戶(hù)名查看系統(tǒng)中指定用戶(hù)的id,該命令的格式如下:id用戶(hù)名用戶(hù)管理命令切換用戶(hù)身份命令:su顯示系統(tǒng)登錄用戶(hù):whosu[選項(xiàng)]用戶(hù)名-:只使用“-”代表連帶用戶(hù)的環(huán)境變量一起切換-c:僅執(zhí)行一次命令,但不切換用戶(hù)身份who命令顯示關(guān)于當(dāng)前在本地系統(tǒng)上的所有用戶(hù)的信息。顯示以下內(nèi)容:登錄名、終端類(lèi)型(tty)、登錄日期和時(shí)間。通過(guò)su命令,可以從普通用戶(hù)切換到root用戶(hù),也可以從root用戶(hù)切換到普通用戶(hù)。從普通用戶(hù)切換到root用戶(hù)需要密碼,從root用戶(hù)切換到普通用戶(hù)不需要密碼。Linux還提供另一個(gè)與su相關(guān)的命令,即sudo命令。sudo可以跳過(guò)root用戶(hù)登錄而去執(zhí)行一些特定命令。$sudopasswdjack#更改jack用戶(hù)的密碼當(dāng)然,這條命令執(zhí)行的前提是當(dāng)前登錄用戶(hù)擁有執(zhí)行sudo命令的權(quán)限,這可以通過(guò)配置/etc/sudoers文件來(lái)實(shí)現(xiàn)。其他常用命令其他常用命令1.find:查找文件或目錄格式:find[目錄列表][匹配標(biāo)準(zhǔn)]參數(shù)說(shuō)明:目錄列表:希望查詢(xún)文件或文件集的目錄列表,目錄間用空格分隔。匹配標(biāo)準(zhǔn):希望查詢(xún)的文件的匹配標(biāo)準(zhǔn)或說(shuō)明。隨著文件的增多,使用搜索工具成了順理成章的事情。find就是這樣一個(gè)強(qiáng)大的命令,它能夠迅速在指定范圍內(nèi)查找到文件,命令格式為:-name文件告訴find要找什么文件;要找的文件包括在引號(hào)中,可以使用通配符(*和?)

-perm模式匹配所有模式為指定數(shù)字型模式值的文件。不僅僅是讀,寫(xiě)和執(zhí)行,所有模式都必須匹配。如果在模式前是負(fù)號(hào)(-),表示采用除這個(gè)模式外的所有模式。

-typex匹配所有類(lèi)型為x的文件。x是c(字符特殊),b(塊特殊),d(目錄),p(有名管道),l(符號(hào)連接),s(套接文件)……-linksn匹配所有連接數(shù)為n的文件。

-user用戶(hù)號(hào)匹配所有用戶(hù)序列號(hào)是前面所指定的用戶(hù)序列號(hào)的文件,可以是數(shù)字型的值或用戶(hù)登錄名。

-atime+/-n匹配所有在n天前/n天內(nèi)訪(fǎng)問(wèn)過(guò)的文件。-mtime+/-n匹配所有在n天前/n天內(nèi)修改過(guò)的文件。

-newer文件匹配所有修改時(shí)間比f(wàn)ile文件更新的文件。

-sizen匹配所有大小小于n塊的文件(若k在n后,則為1K字節(jié)塊),1塊=512字節(jié)。

-print顯示整個(gè)文件路徑和名稱(chēng)。一般來(lái)說(shuō),都要用-print,如果沒(méi)有這個(gè)參數(shù),則find命令進(jìn)行所要求的搜索是沒(méi)有顯示結(jié)果的。

其它常用命令34通過(guò)文件名查找

#find/root-namehttpd.conf–print2)根據(jù)部分文件名查找 #find/root–name‘*http*’-print3)根據(jù)文件的特征查詢(xún)

#find/etc-size+10-size12-print$find/home/-namedays-print/home/hll/prac/daysfind:‘/home/hll/.dbus’:Permissiondeniedfind:‘/home/hll/.cache/dconf’:Permissiondenied在find文件時(shí),如果用到通配符,需要用單引號(hào)括起來(lái)。$

find/home/yyb‘e*.sh’$find/home/yyb‘e[234].sh’其他常用命令查找文件內(nèi)容:grep在很多時(shí)候,并不需要列出文件的全部?jī)?nèi)容,用戶(hù)要做的只是找到包含某些信息的一行。這個(gè)時(shí)候,如果使用more命令一行一行去找的話(huà),無(wú)疑很浪費(fèi)精力。當(dāng)文件內(nèi)容特別多的時(shí)候,這樣的做法則完全不可行了。為了在文件中尋找某些信息,可以使用grep命令$grepundaysweatherdays:Sundayweather:sunny#在文件days和weather里面找有字符串un的行其他常用命令less、more和cat命令都是用于查看文本文件內(nèi)容,但less的功能更為強(qiáng)大。less改進(jìn)了cat、more命令的很多細(xì)節(jié),并添加了許多的特性,這些特性讓less看起來(lái)更像是一個(gè)文本編輯器——只是去掉了文本編輯功能。分屏查看文件內(nèi)容:lessless在屏幕底部顯示一個(gè)冒號(hào)“:”等待用戶(hù)輸入命令。如果想向下翻一頁(yè),可以按下空格鍵,如果想向上翻一頁(yè),按下B鍵。也可以用光標(biāo)鍵向前、后、甚至左右移動(dòng)。如果要在文件中搜索某一個(gè)字符串,可以使用“/”加想要查找的內(nèi)容,less會(huì)把找到的第一個(gè)搜索目標(biāo)高亮顯示,要繼續(xù)查找相同的內(nèi)容,只要再次輸入“/”,并按下回車(chē)鍵。最后,按下Q鍵可以退出less程序并返回Shell提示符。其他常用命令date命令可以用來(lái)顯示或設(shè)定系統(tǒng)的日期與時(shí)間。在顯示方面,使用者可以自行設(shè)定時(shí)間顯示格式,格式設(shè)定為一個(gè)加號(hào)后接數(shù)個(gè)標(biāo)記。若是不以加號(hào)作為開(kāi)頭,則表示要設(shè)定時(shí)間。時(shí)間格式為:MMDDhhmm[YYYY][.ss]。其中

MM為月份,DD為日,hh為小時(shí),mm為分鐘,YYYY為年份,ss為秒數(shù)。顯示系統(tǒng)時(shí)間:date$date #顯示系統(tǒng)時(shí)間TueNov1200:38:25PST2019$date111216462019.30 #設(shè)置系統(tǒng)完整時(shí)間TueNov1216:46:30PST2019$date-s1651 #設(shè)置系統(tǒng)的時(shí)、分TueNov1216:51:00PST2019其他常用命令ps命令是processstatus的縮寫(xiě),用于顯示當(dāng)前進(jìn)程的狀態(tài)。使用該命令可以確定有哪些進(jìn)程正在運(yùn)行和運(yùn)行的狀態(tài)、進(jìn)程是否結(jié)束、進(jìn)程有沒(méi)有僵死、哪些進(jìn)程占用了過(guò)多的資源等等。kill命令用來(lái)終止指定的進(jìn)程的運(yùn)行。通常,終止一個(gè)前臺(tái)進(jìn)程可以使用Ctrl+C鍵,但是,對(duì)于一個(gè)后臺(tái)進(jìn)程就須用kill命令來(lái)終止。顯示進(jìn)程命令:ps關(guān)閉進(jìn)程命令:killkill[參數(shù)][進(jìn)程號(hào)]$ps-ef|grepvimroot32682884016:21pts/100:00:00viminstall.logroot33702822016:21pts/000:00:00grepvim$kill3268$kill3268-bash:kill:(3268)-Nosuchprocess#連續(xù)關(guān)閉進(jìn)程3268,第2次提示錯(cuò)誤其他常用命令init是Linux系統(tǒng)操作中不可缺少的程序之一。init進(jìn)程,它是一個(gè)由內(nèi)核啟動(dòng)的用戶(hù)級(jí)進(jìn)程,然后由它來(lái)啟動(dòng)后面的任務(wù),包括多用戶(hù)環(huán)境,網(wǎng)絡(luò)等。init命令很簡(jiǎn)單,直接輸入init+模式對(duì)應(yīng)的編號(hào)。shutdown是系統(tǒng)關(guān)機(jī)命令,也可以用于關(guān)閉所有程序,并依用戶(hù)的需要,進(jìn)行重新開(kāi)機(jī)或關(guān)機(jī)的動(dòng)作。shutdown命令執(zhí)行后,會(huì)以廣播的形式通知正在系統(tǒng)中工作的所有用戶(hù),系統(tǒng)將在指定的時(shí)間內(nèi)關(guān)閉。Init命令關(guān)機(jī)命令:shutdowninit0#停機(jī) init1#單用戶(hù)模式,只root用戶(hù)進(jìn)行維護(hù)init2#多用戶(hù)模式,不能使用NFSinit3#完全多用戶(hù)模式(標(biāo)準(zhǔn)的運(yùn)行級(jí))init4#安全模式init5#切換到圖形化界面init6#重新啟動(dòng)shutdown常用參數(shù)有:-tseconds:設(shè)定在幾秒鐘之后進(jìn)行關(guān)機(jī)程序;-k:將警告訊息傳送給所有使用者;-r:關(guān)機(jī)后重新開(kāi)機(jī);-h:關(guān)機(jī)后停機(jī);time:設(shè)定關(guān)機(jī)的時(shí)間。其他常用命令zip命令用于壓縮文件,unzip命令用于解壓文件。tar是Linux環(huán)境下最常用的備份工具之一,它可用于建立、還原、查看、管理文件,也可方便的追加新文件到備份文件中,或僅更新部分的備份文件,以及解壓、刪除指定的文件。熟悉其常用參數(shù),能方便日常的系統(tǒng)管理工作。文件壓縮命令:zip打包與解包:tarwww.islide.cc41常用選項(xiàng)意義-A將文檔與已有的文檔合并-c建立新的文檔-d比較文檔與當(dāng)前文件的不同之處--delete從文檔中刪除-f使用檔名,請(qǐng)留意,在f之后要立即接檔名-t列出文檔中文件的目錄-v壓縮的過(guò)程中顯示文件

-x從文檔展開(kāi)文件-C轉(zhuǎn)到指定的目錄-k保存現(xiàn)有文件;從文檔中展開(kāi)時(shí)不進(jìn)行覆蓋-m當(dāng)從一個(gè)文檔中恢復(fù)文件時(shí),不使用新的時(shí)間標(biāo)簽-z用gzip

對(duì)文檔壓縮或解壓www.islide.cc42$tar-cvftest.tar./Scripts/#將Scripts子目錄下的所有文件打包成test.tar$tar-jcvftest.tar.zip2./Scripts/#將Scripts子目錄下的所有文件打包并使用

bzip2壓縮,得到test.tar.zip2文件$tar-jxvftest.tar.zip2-C/home/hll#將test.tar.zip2解包到/home/hll目錄下$tar-tftest.tar.zip2#顯示test.tar.zip2包中的文件和目錄tar使用舉例其他常用命令Linux提供了豐富的幫助手冊(cè),當(dāng)需要查看某個(gè)命令的參數(shù)時(shí)不必到處上網(wǎng)查找,只要man一下即可。此外,man還可以用于查詢(xún)系統(tǒng)庫(kù)文件中的一些函數(shù)定義和使用方法。man基本用法如下:whereis命令主要用于查找程序文件,并提供這個(gè)文件的二進(jìn)制可執(zhí)行文件、源代碼文件和使用手冊(cè)頁(yè)存放的位置。常用參數(shù)包括-b、-m和-s,分別對(duì)應(yīng)查找二進(jìn)制可執(zhí)行文件、使用手冊(cè)和源代碼文件。此外,也可以通過(guò)-B、-M和-S等參數(shù)在指定目錄下查找對(duì)應(yīng)文件。獲得幫助命令:man查找特定程序:whereisman[參數(shù)][命令]。 #詳細(xì)的命令用法命令–help #簡(jiǎn)單的命令用法命令行高級(jí)技巧Tab鍵自動(dòng)補(bǔ)齊文件名是命令中最常見(jiàn)的參數(shù),然而每次完整輸入文件名是一件很麻煩的事情,特別是當(dāng)文件名特別長(zhǎng)的時(shí)候。所以,bash提供了這樣一種特性——命令行補(bǔ)全。在輸入文件名的時(shí)候,只需要輸入前面幾個(gè)字符,然后按下Tab鍵,Shell會(huì)自動(dòng)把文件名補(bǔ)全。如果以所鍵入的字符開(kāi)頭的文件不止一個(gè),那么可以連續(xù)按下Tab鍵兩次,Shell會(huì)以列表的形式給出所有以鍵入字符開(kāi)頭的文件。

命令行高級(jí)技巧通配符使用Shell有一套被稱(chēng)作通配符的專(zhuān)用符號(hào),分別是*、?、[]。這些通配符可以搜索并匹配文件名的一部分,從而大大簡(jiǎn)化了命令的輸入。也可以使用短線(xiàn)“-”來(lái)指定一個(gè)字符集范圍。所有包括在上下界之間的字符都會(huì)被匹配?!?”用于匹配文件名中任意長(zhǎng)度的字符串。和“*”類(lèi)似的通配符是“?”。但和“*”匹配任意長(zhǎng)度的字符串不同,“?”只匹配一個(gè)字符?!癧]”用于匹配所有出現(xiàn)在方括號(hào)內(nèi)的字符命令行高級(jí)技巧重定向a)輸出重定向符>、>>“<<”為此處操作符,該操作符在從鍵盤(pán)讀取內(nèi)容時(shí),讀到指定的字符串時(shí),便停止讀取動(dòng)作,然后將所讀的內(nèi)容輸出。

“<”標(biāo)準(zhǔn)輸入重定向符用于改變一個(gè)命令的輸入源。>和>>的區(qū)別在于:>重定向符每次都是以覆蓋的方式重寫(xiě)后面的文件內(nèi)容,若指定的文件不存在,系統(tǒng)會(huì)自動(dòng)創(chuàng)建。若要將內(nèi)容以追加的方式添加到后面的文件中,則應(yīng)采用>>重定向符。輸出重定向符能實(shí)現(xiàn)將一個(gè)命令的輸出重定向到一個(gè)文件中。b)輸入重定向符<、<<

cat<<end>file.txt命令行高級(jí)技巧組合命令組合命令的基本方法是采用命令棧的形式。所謂命令棧,就是將所有需要運(yùn)行的命令放到Shell的一行上,再用分號(hào)“;”隔開(kāi)每個(gè)命令。接著依次順序執(zhí)行每個(gè)命令,只有一個(gè)命令結(jié)束運(yùn)行(無(wú)論成功與失?。┖?,才會(huì)運(yùn)行下一個(gè)命令。$cdEmbedded;ls-l;mkdirScript;mv*.shScript分割命令的另一個(gè)辦法是用&&。它同樣是依次執(zhí)行每個(gè)命令,但只有當(dāng)前面一條指令運(yùn)行成功后,才能執(zhí)行下一條指令。如果前面命令運(yùn)行失敗,后續(xù)命令都不會(huì)被執(zhí)行。$mv*.sh..&&cd..&&rm–rfScript&&ls-l命令行高級(jí)技巧48使用“$()”可將一個(gè)命令的輸出插入到另一個(gè)命令,這就是所謂的命令替換。$ls #顯示當(dāng)前目錄內(nèi)容

#無(wú)內(nèi)容,空目錄$mkdir$(date"+%Y-%m-%d")&&ls #創(chuàng)建目錄并顯示目錄內(nèi)容2019-10-20 #有一個(gè)以日期命名的目錄使用“|”可以將一個(gè)命令的輸出作用于另一個(gè)命令的輸入。$ls-l|grepconf|less

上例中,先將ls命令的結(jié)果輸入給grep命令,實(shí)現(xiàn)查找文件名中含conf的文件的目的;然后將grep命令的結(jié)果輸入給less命令,實(shí)現(xiàn)分屏顯示。/03Shell編程基礎(chǔ)Shell腳本的執(zhí)行Shell腳本本質(zhì)上只是普通文本文件,由bash對(duì)其進(jìn)行解釋執(zhí)行。因此,凡是可以在bash提示符后輸入的命令,都可以出現(xiàn)在腳本文件里。Shell腳本執(zhí)行有三種方法:標(biāo)準(zhǔn)方法將下列文本加到腳本文件的頂端(第一行靠左對(duì)齊):#!/bin/bash然后通過(guò)下面命令改變文件訪(fǎng)問(wèn)模式,使其成為可執(zhí)行文件(這里假設(shè)腳本名為myscript):$chmod+xmyscript$./myscriptShell腳本的執(zhí)行用bash命令執(zhí)行腳本用source命令執(zhí)行腳本對(duì)于會(huì)影響shell環(huán)境的腳本,應(yīng)該交給當(dāng)前的shell,即loginshell去運(yùn)行。此時(shí)執(zhí)行方式為“source腳本名”或“.腳本名”的方式。$sourcemyscriptbash會(huì)將它的參數(shù)視為腳本文件的名稱(chēng),并予以運(yùn)行。$bashmyscript

采用第3種方式,腳本中的變量會(huì)添加到當(dāng)前登錄用戶(hù)的環(huán)境變量中。Shell腳本的輸入輸出輸入用read命令來(lái)實(shí)現(xiàn),它每次從stdin(標(biāo)準(zhǔn)輸入,一般指鍵盤(pán))讀入一行數(shù)據(jù),并將其存入一個(gè)變量中。具體來(lái)說(shuō),read命令用于一個(gè)一個(gè)詞組地接收輸入的參數(shù),每個(gè)詞組需要使用空格進(jìn)行分隔;如果輸入的詞組個(gè)數(shù)大于需要的參數(shù)個(gè)數(shù)(如變量的個(gè)數(shù)),則多出的詞組將被作為整體為最后一個(gè)參數(shù)接收。由printf和echo命令來(lái)實(shí)現(xiàn),這兩個(gè)命令的功能基本類(lèi)似,都可以用于字符串或變量的輸出,默認(rèn)輸出設(shè)備都是stdout(標(biāo)準(zhǔn)輸出,一般指屏幕)。使用printf的腳本比使用echo移植性更好。在進(jìn)行輸出時(shí),printf和echo最大的不同在于printf不像echo那樣會(huì)自動(dòng)提供一個(gè)換行符號(hào),必須顯式地將換行符號(hào)指定成“\n”。輸出Shell變量變量命名Shell變量命名必須遵循如下規(guī)則:命名只能使用英語(yǔ)字母,數(shù)字和下劃線(xiàn),首字符不能以數(shù)字開(kāi)頭;中間不能有空格,可以使用下劃線(xiàn)“_”;不能使用標(biāo)點(diǎn)符號(hào);不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)。Shell變量變量賦值在Shell編程中,通常情況下變量并不需要專(zhuān)門(mén)的定義和初始化。一個(gè)沒(méi)有初始化的Shell變量被認(rèn)為是一個(gè)空字符串。用戶(hù)可以通過(guò)變量的賦值操作來(lái)完成變量的聲明并賦予一個(gè)特定的值,也可以通過(guò)賦值語(yǔ)句為一個(gè)變量多次賦值,以改變其值。默認(rèn)為字符串變量。在Shell中,變量的賦值使用以下語(yǔ)法:v_name=value。其中,v_name表示變量名,value表示將要賦給變量的值;中間的等號(hào)“=”稱(chēng)為賦值符號(hào),賦值符號(hào)的左右兩邊不能直接跟空格,否則Shell會(huì)將其視為命令。

Shell變量變量引用當(dāng)變量賦值完成之后,就需要使用變量的值。在Shell中,用戶(hù)可以通過(guò)在變量名前加上“$變量名”或“${變量名}”來(lái)獲取該變量的值。實(shí)際上,在前面的許多例子中,已經(jīng)多次使用這個(gè)符號(hào)來(lái)獲取變量的值。通常情況下,“$變量名”或“${變量名}”沒(méi)有差別。但是,當(dāng)在一串字符串中引用變量構(gòu)成新的字符串時(shí),建議采用“${變量名}”這種方法進(jìn)行變量引用。$Str1=“Hello”$Str2=$Str1World!$Str2=${Str1}World!Shell變量除用$符號(hào)引用變量外,在Shell腳本中也經(jīng)常用到其它4種引用符號(hào),這些引用符號(hào)的作用如下表所示。假設(shè)變量x1=Windows,則下面命令執(zhí)行結(jié)果如下:$echo"${x1}10"Windows10

$echo'${x1}10'${x1}10$echo\'${x1}10\''Windows10'$echo`pwd`/home/hllShell變量變量作用域與其它程序設(shè)計(jì)語(yǔ)言一樣,Shell中的變量也分為全局變量和局部變量?jī)煞N。下面分別介紹這兩種變量的作用域。(1)全局變量(2)局部變量Shell編程中,全局變量可以在腳本中定義,也可以在某個(gè)函數(shù)中定義。實(shí)際上,只要不是用local關(guān)鍵字定義的變量,都可以視為全局變量,其作用域?yàn)閺谋欢x的地方開(kāi)始,一直到Shell腳本結(jié)束或者被顯示地刪除。局部變量通常僅限于某個(gè)程序段訪(fǎng)問(wèn),例如函數(shù)內(nèi)部。在Shell編程中,可以在函數(shù)內(nèi)部通過(guò)local關(guān)鍵字來(lái)定義局部變量。另外,函數(shù)的參數(shù)也是局部變量。Shell變量www.islide.cc58#!/bin/bashfunc() #定義函數(shù){ echo"$x" #輸出變量x的值 x=10 #修改變量x的值}x=20 #在腳本中定義變量xfunc #調(diào)用函數(shù)echo"$x" #輸出變量x的值1. #!/bin/bash2. func() #定義函數(shù)3. {4. echo"$x" #輸出變量x的值5. localx=10 #定義局部變量x6. echo"$x" #輸出變量x的值7. }8. x=20 #在腳本中定義變量x9. func #調(diào)用函數(shù)10. echo"$x" #輸出變量x的值Shell變量默認(rèn)變量不需要用戶(hù)定義,可以直接使用的變量,包括環(huán)境變量和自動(dòng)變量。(1)環(huán)境變量(2)自動(dòng)變量環(huán)境變量用于用戶(hù)登錄系統(tǒng)時(shí)建立Shell運(yùn)行環(huán)境,它由一系列環(huán)境變量及其值組成。運(yùn)行環(huán)境包括用戶(hù)Home目錄、系統(tǒng)提示符、用戶(hù)名、搜索路徑等。

自動(dòng)變量由Shell自動(dòng)根據(jù)上下文環(huán)境確定其值,用戶(hù)只能引用這些變量,不能對(duì)其值進(jìn)行重新設(shè)置。Shell變量www.islide.cc60常用環(huán)境變量常用自動(dòng)變量算術(shù)運(yùn)算算術(shù)運(yùn)算符Shell中的算術(shù)運(yùn)算符主要包括加、減、乘、除、求余,以及冪運(yùn)算等。下表列出了常用的基本算術(shù)運(yùn)算符及其使用方法。算術(shù)運(yùn)算算術(shù)運(yùn)算命令雖然Shell支持算術(shù)運(yùn)算,但不能直接使用上表中的符號(hào),需要配合下面的命令才能完成算術(shù)運(yùn)算。expr命令let命令語(yǔ)法格式:exprexpression。運(yùn)算符左右要有空格語(yǔ)法格式:letvar=expression。運(yùn)算符兩邊不能有空格1. #!/bin/bash2. letm=23. letn=184. echo"m=$m,n=$n"5. echo'exprm+n='`expr$m+$n`6. echo'exprn%m='`expr$n%$m`7. echo'exprm-n='`expr$m-$n`8. echo'exprm/n='`expr$m/$n`9. letx=$m+$n10. echo"letm+n=$x"11. letx=$n%$m12. echo"letn%m=$x"13. #end算術(shù)運(yùn)算位運(yùn)算所謂位運(yùn)算,即對(duì)變量每個(gè)位進(jìn)行操作。BashShell支持的位運(yùn)算符如下表所示。語(yǔ)法格式:$[expression]或let"expression"。算術(shù)運(yùn)算641. #!/bin/bash2. letm=23. letn=44. echo"m=$m,n=$n"5. echo"leftshift,n<<m="$[$n<<$m] #位運(yùn)算符兩邊有空格6. echo"rightshift,n>>m="$[$n>>$m]7. echo"and,n&m="$[$n&$m] #位運(yùn)算符兩邊無(wú)空格8. echo"or,n|m="$[$n|$m]9. echo"not,~n="$[~$n]條件測(cè)試條件測(cè)試的基本語(yǔ)法條件測(cè)試包括test命令和[]命令。條件測(cè)試的語(yǔ)法:testexpression或[expression]。其中,參數(shù)expression表示需要進(jìn)行測(cè)試的條件表達(dá)式,可以由字符串、整數(shù)、文件名,以及各種運(yùn)算符組成。在使用[expression]進(jìn)行條件測(cè)試時(shí),條件表達(dá)式與左右方括號(hào)之間都必須有一個(gè)空格。條件測(cè)試字符串測(cè)試在任何程序設(shè)計(jì)語(yǔ)言中,字符串都是最常見(jiàn)的數(shù)據(jù)類(lèi)型之一。在Shell中,用戶(hù)可以通過(guò)5種運(yùn)算符來(lái)對(duì)字符串進(jìn)行條件測(cè)試操作,如下表所示。條件測(cè)試str1="abc"str2="cba" #可以在同一行中定義兩個(gè)變量echo"str1=$str1,str2=$str2"test$str1

#測(cè)試變量str1是否非空echo$? #顯示上條測(cè)試命令的結(jié)果,0為真,1為假test$str1=$str2

#測(cè)試字符串相等,等號(hào)兩邊有空格echo$?test$str1="abc" #測(cè)試變量str1是否等于abcecho$?[-z$str1]

#測(cè)試變量str1是否為空串echo$?[-n$str1]

#測(cè)試變量str1是否為非空串echo$?條件測(cè)試整數(shù)測(cè)試整數(shù)測(cè)試的語(yǔ)法:testnum1opnum2或者[num1opnum2]。其中,num1和num2分別表示參與比較的兩個(gè)整數(shù),可以是常量或者變量,op表示條件運(yùn)算符,常用整數(shù)測(cè)試的條件運(yùn)算符如表所示。letv1=2v2=4echo"v1=$v1,v2=$v2"test$v1-eq$v2echo$?[$v1-ne$v2]echo$?test$v1-gt$v2echo$?[$v1-lt$v2]echo$?test$v1-ge$v2echo$?[$v1-le$v2]echo$?條件測(cè)試文件測(cè)試語(yǔ)法格式:testopfile或者[opfile]在上面的語(yǔ)法中,op表示文件條件測(cè)試運(yùn)算符,file為測(cè)試文件名。常用的文件條件測(cè)試運(yùn)算符如右表所示。$test-ee6.sh$[-re1.sh]

條件測(cè)試邏輯測(cè)試在Shell編程中,經(jīng)常遇到同時(shí)判斷多個(gè)條件是否成立或部分成立的情況,此時(shí),就可以利用Shell的邏輯運(yùn)算符將多個(gè)不同的條件組合起來(lái),從而構(gòu)成一個(gè)復(fù)雜的條件表達(dá)式。常用的邏輯運(yùn)算符如表所示。$test"$x"-gt20-a"$x"-lt30

#判斷20<x<30是否成立$[-eexam-1-a-wexam-1] #判斷文件exam-1是否存在且可寫(xiě)/04Shell編程的控制語(yǔ)句條件判斷語(yǔ)句if結(jié)構(gòu)條件判斷語(yǔ)句使用if結(jié)構(gòu)來(lái)實(shí)現(xiàn),其結(jié)構(gòu)如下:在上面的語(yǔ)法中,expression通常代表測(cè)試某個(gè)條件,但是也可以是Shell命令。ifexpressionthen

statement......fiifexpression1thenstatement...elifexpressionthenstatement

...elsestatement...fi73通過(guò)if-elif-else結(jié)構(gòu),將學(xué)生的百分制成績(jī)轉(zhuǎn)換成優(yōu)(≥85)、通過(guò)(60-85之間)、不通過(guò)(<60),代碼如下:#!/bin/bashecho"Pleaseenterascore:" #輸出提示信息readscore #讀取用戶(hù)輸入數(shù)據(jù)if[-z"$score"] #如果用戶(hù)沒(méi)有輸入數(shù)據(jù),提示錯(cuò)誤thenecho"Youenternothing.Error!"elif["$score"-lt0-o"$score"-gt100]#如果分?jǐn)?shù)不在0-100,提示錯(cuò)誤thenecho"Youenterwrongdata.Error!"elif["$score"-ge85] #如果≥85分,提示優(yōu)秀thenecho"Congratulation.Thegradeisexcellent!"elif["$score"-ge60] #如果在60-85之間,提示通過(guò)thenecho"Youpassedinthistest."else

#如果小于60分,提示未通過(guò)echo"Sorry,youfailedinthistest."fi多條件判斷語(yǔ)句2.case結(jié)構(gòu),實(shí)現(xiàn)多條件判斷在左面的語(yǔ)法中,variable是一個(gè)變量,case語(yǔ)句會(huì)將該變量的值與value1~valueN中的每一個(gè)值相比較,如果與某個(gè)value的值相等,則執(zhí)行該value所對(duì)應(yīng)的一組語(yǔ)句。當(dāng)遇到“;;”符號(hào)時(shí),就跳出case語(yǔ)句,執(zhí)行esac語(yǔ)句后面的語(yǔ)句。對(duì)于變量名variable,可以使用雙引號(hào),也可以不使用。每個(gè)case子句中的條件測(cè)試部分,都以右括號(hào)“)”結(jié)束。每個(gè)case子句都以一對(duì)分號(hào)“;;”作為結(jié)束符。casevariableinvalue1) statement-body-1 ;;value2) statement-body-2 ;;…valueN) statement-body-N ;;*) statement-body-N+1 ;;esac通過(guò)case結(jié)構(gòu),判斷用戶(hù)輸入的4種字符類(lèi)型,代碼如下:75#!/bin/bashecho"Hitakey,thenhittheenterkey." #提示輸出信息readkeypress #讀取用戶(hù)按下的鍵case"$keypress"in #case語(yǔ)句開(kāi)始

[[:lower:]]) #小寫(xiě)字母,涉及了正則表達(dá)式的內(nèi)容echo"Lowercaseletter.";;[[:upper:]]) #大寫(xiě)字母echo"Uppercaseletter.";;[0-9]) #單個(gè)數(shù)字echo"Digit.";;*) #*代表缺省條件,這里代表其他字符echo"otherletter.";;esac循環(huán)結(jié)構(gòu)3.for循環(huán)結(jié)構(gòu)在上面的語(yǔ)法中,variable稱(chēng)為循環(huán)變量,in后面是變量取值。do和done之間的所有的語(yǔ)句稱(chēng)為循環(huán)體,即循環(huán)結(jié)構(gòu)中重復(fù)執(zhí)行的語(yǔ)句。forvariablein{list}dostatement...doneforvariablein{start..end..step}dostatement...doneforvariablein${array[*]}dostatement...done采用for循環(huán)結(jié)構(gòu),找出數(shù)組的元素個(gè)數(shù)及最小值。77#!/bin/basharray=(1-47-82034) #Shell中,用()來(lái)定義數(shù)組letn=0forvarin${array[*]} #對(duì)數(shù)組中的每個(gè)元素doif[$n-eq0] #初始值設(shè)為數(shù)組的第一個(gè)值thenletmin=$varelseif[$var-lt$min] #如果比已知的最小值還小,保存新的最小值thenmin=$varfifiletn=n+1 #處理序號(hào)doneecho"Theminvalueinthearrayis$min."echo"Thenumberofelementsinthearrayis$n."循環(huán)結(jié)構(gòu)4.while循環(huán)結(jié)構(gòu)while循環(huán)結(jié)構(gòu)的格式如下:在上面的語(yǔ)法中,expression表示while循環(huán)體執(zhí)行時(shí)需要滿(mǎn)足的條件,do和done這兩個(gè)關(guān)鍵字之間的語(yǔ)句構(gòu)成了循環(huán)體。當(dāng)while循環(huán)結(jié)構(gòu)在執(zhí)行時(shí),會(huì)首先計(jì)算expression表達(dá)式的值,如果表達(dá)式的值為0,則執(zhí)行循環(huán)體中的語(yǔ)句;否則,退出while循環(huán),執(zhí)行done關(guān)鍵字后面的語(yǔ)句。當(dāng)循環(huán)體中的語(yǔ)句執(zhí)行完成之后,會(huì)重新計(jì)算expression的值,如果仍然是0,則繼續(xù)執(zhí)行下一次的循環(huán),直至expression的值為非0。whileexpressiondostatement...done采用while循環(huán)結(jié)構(gòu),實(shí)現(xiàn)猜數(shù)字的游戲。79#!/bin/bashletcorrect=75n=1echo"Pleaseenteranumberbetween1and100."#提示用戶(hù)輸入數(shù)字readvar #讀取用戶(hù)輸入的數(shù)字while[$var-ne$correct] #while循環(huán)開(kāi)始doif[$var-lt$correct] #提示用戶(hù)輸入數(shù)字太小thenecho"Toosmall.Tryagain."readvarelse[$var-gt$correct] #提示用戶(hù)輸入數(shù)字太大

echo"Toobig.Tryagain."readvarfiletn=n+1doneecho"Congratulation!Youinputthecorrectnumber$correctin$ntimes."循環(huán)結(jié)構(gòu)5.until循環(huán)結(jié)構(gòu)until循環(huán)的功能是不斷地重復(fù)執(zhí)行循環(huán)體中的語(yǔ)句,直至某個(gè)條件成立。在上面的語(yǔ)法中,expression是一個(gè)條件表達(dá)式。當(dāng)該表達(dá)式的值不為0時(shí),將執(zhí)行do和done之間的語(yǔ)句;當(dāng)expression的值為0時(shí),將退出until循環(huán)結(jié)構(gòu),繼續(xù)執(zhí)行done語(yǔ)句后面的其他語(yǔ)句。實(shí)質(zhì)上,until循環(huán)結(jié)構(gòu)和while循環(huán)結(jié)構(gòu)的差別就在于一個(gè)是條件為假時(shí)執(zhí)行循環(huán)體,一個(gè)是條件為真時(shí)執(zhí)行循環(huán)體。因此,這兩個(gè)循環(huán)結(jié)構(gòu)可以互相轉(zhuǎn)換。untilexpressiondostatement...doneuntil循環(huán)的語(yǔ)法格式如下:循環(huán)結(jié)構(gòu)6.利用break和continue控制循環(huán)在Shell的循環(huán)結(jié)構(gòu)中,break語(yǔ)句與continue語(yǔ)句的作用與C程序設(shè)計(jì)中的break與continue的作用完全一樣。具體來(lái)說(shuō),break用來(lái)跳出當(dāng)前循環(huán),即結(jié)束本層循環(huán)體;continue用來(lái)結(jié)束本次循環(huán),因而它的作用不是退出循環(huán)體,而是跳過(guò)當(dāng)前循環(huán)體中該語(yǔ)句后面的語(yǔ)句,重新從循環(huán)語(yǔ)句開(kāi)始的位置執(zhí)行。此外,在默認(rèn)情況下,break語(yǔ)句僅僅退出一層循環(huán),如果用戶(hù)想要退出多層循環(huán),可以在break語(yǔ)句的后面增加一個(gè)數(shù)字作為參數(shù),用來(lái)指定要退出的循環(huán)的層數(shù)。比較下面腳本的輸出:82#!/bin/bash #!/bin/bash forxin1234 forxin1234do do

echo"hello" echo"hello"

continue

break

echo"shell" echo"shell"done done嵌入式系統(tǒng)原理與設(shè)計(jì)第9章Linux下程序設(shè)計(jì)工具第XX章0102030405Vi編輯器GCC編譯器GDB調(diào)試Make項(xiàng)目管理器Makefile編程/01Vi編輯器Vi編輯器圖形界面編輯器的代表是gedit文本界面編輯器的代表是Vi,它沒(méi)有采用圖形界面,因而運(yùn)行效率很高,缺點(diǎn)在于需要記住眾多的命令。Linux下的編輯器可以分為圖形界面編輯器和文本界面編輯器。Vi的啟動(dòng)與退出啟動(dòng):在Linux終端命令提示符下輸入vi(或vi文件名),即可啟動(dòng)vi編輯器。#vifilename退出:要退出Vi,必須先按“Esc”鍵回到命令行模式,然后輸入“:”,此時(shí)光標(biāo)會(huì)停留在最下面一行(底行模式),再輸入“q”,最后按“Enter”鍵即可退出。Vi工作模式Vi工作模式命令行模式:也叫做“普通模式”,它是啟動(dòng)Vi編輯器后的初始模式。在該模式下主要是使用隱式命令(命令不顯示)來(lái)實(shí)現(xiàn)光標(biāo)的移動(dòng)、復(fù)制、粘貼、刪除等操作。在該模式下,編輯器并不接受用戶(hù)從鍵盤(pán)輸入的任何字符作為文檔的編輯內(nèi)容。插入模式:在該模式下,用戶(hù)輸入的任何字符都被認(rèn)為是編輯到文件中的內(nèi)容,并直接顯示在Vi的文本編輯區(qū)。底行模式:在該模式下,用戶(hù)輸入的任何字符都會(huì)在Vi的最下面一行顯示,按“Enter”鍵后便會(huì)執(zhí)行該命令(當(dāng)然前提是輸入的命令正確)。Vi使用實(shí)例練習(xí)參考教材中三種模式的常用命令,編輯源代碼并將其命名為vi_test.c/*vi_test.c*/#include<stdio.h>intmax(inta,intb);main(){inta,b;printf("Enterab:");scanf("%d%d",&a,&b);printf("max=%d\n",max(a,b));}intmax(inta,intb){intp;p=a>b?a:b;return(p);}Vi使用實(shí)例練習(xí)在編輯完vi_test.c后完成以下操作:(1)為了方便查看代碼,在Vi編輯器中顯示行號(hào)(2)將第5-8行的內(nèi)容復(fù)制到第8行行首(3)刪除此時(shí)光標(biāo)所在行(4)將源代碼每行的第一個(gè)字符“i”替換成字符“n”。(5)撤銷(xiāo)上一步操作/02GCC編譯器GCC編譯器GCC全稱(chēng)是GNUCCompiler,它是GNU組織推出的符合ANSIC標(biāo)準(zhǔn)的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器。經(jīng)過(guò)幾十年的發(fā)展,GCC已經(jīng)成為L(zhǎng)inux下最重要的免費(fèi)軟件開(kāi)發(fā)工具,它不僅支持C語(yǔ)言,還支持C++語(yǔ)言、Java語(yǔ)言、Objective語(yǔ)言、Ada語(yǔ)言、Pascal語(yǔ)言、COBOL語(yǔ)言等。因此,GCC也被成為GNU編譯器集合。此外,GCC還是一個(gè)交叉平臺(tái)編譯器GCC編譯器交叉編譯器:在一個(gè)CPU平臺(tái)上編譯另一個(gè)CPU平臺(tái)的程序,這兩個(gè)CPU平臺(tái)的指令體系結(jié)構(gòu)不一樣GCC目前支持所有主流CPU平臺(tái),可以完成從C、C++、Java等源文件向運(yùn)行在特定CPU硬件平臺(tái)上的目標(biāo)代碼的轉(zhuǎn)換。GCC編譯器所能支持的部分源程序的格式后綴名所對(duì)應(yīng)語(yǔ)言后綴名所對(duì)應(yīng)語(yǔ)言.cC語(yǔ)言源程序.s/.S匯編語(yǔ)言源程序.C/.cc/.cxxC++源程序.h預(yù)處理文件(頭文件).mObjective-C源程序.o目標(biāo)文件.i已經(jīng)經(jīng)過(guò)預(yù)處理的C程序.a/.so編譯后的文件.ii已經(jīng)經(jīng)過(guò)預(yù)處理的C++程序

GCC編譯流程預(yù)處理(Pre-Processing)編譯(Compiling)匯編(Assembling)鏈接(Linking)GCC編譯流程下面以一個(gè)簡(jiǎn)單的“Hello,World”實(shí)例程序來(lái)說(shuō)明,/*hello.c*/#include<stdio.h>intmain(){printf("Hello!Thisisourembeddedworld!\n");return0;}return(p);}預(yù)處理階段預(yù)處理階段主要完成3個(gè)功能:1)將源文件中以“#include”格式包含的文件復(fù)制到編譯的源文件中;2)用實(shí)際值替換用“#define”定義的字符串;3)根據(jù)“#if”后面的條件確定實(shí)際需要編譯的源代碼。注:實(shí)例代碼中僅需將stdio.h復(fù)制到源文件預(yù)處理階段GCC中,“-E”選項(xiàng)用來(lái)指示僅做預(yù)處理,預(yù)處理結(jié)束后停止編譯過(guò)程。[root@localhostgcc]#gcc–Ehello.c–ohello.i在上面命令中,選項(xiàng)“-o”用來(lái)指定輸出的目標(biāo)文件名稱(chēng),“hello.i”為已經(jīng)過(guò)預(yù)處理的C源程序typedefint(*__gconv_trans_fct)(struct__gconv_step*,struct__gconv_step_data*,void*,__constunsignedchar*,__constunsignedchar**,__constunsignedchar*,unsignedchar**,size_t*);…#2"hello.c"2intmain(){printf("Hello!Thisisourembeddedworld!n");return0;}編譯階段在編譯階段,GCC首先要檢查經(jīng)過(guò)預(yù)處理后的源代碼的規(guī)范性(是否有語(yǔ)法錯(cuò)誤等),檢查無(wú)誤后再把源代碼翻譯成目標(biāo)CPU平臺(tái)的匯編語(yǔ)言。[root@localhostgcc]#gcc–Shello.i–ohello.sGCC中,“-S”選項(xiàng)用來(lái)指示僅做編譯、生成匯編代碼,匯編代碼生成后結(jié)束編譯過(guò)程。編譯階段.file"hello.c".section.rodata.align4.LC0:.string"Hello!Thisisourembeddedworld!".text.globlmain.typemain,@functionmain:push1%ebpmovl%esp,%ebpsubl$8,%espandl$-16,%espmovl$0,%eaxaddl$15,%eaxaddl$15,%eaxshrl$4,%eaxsall$4,%eaxsubl%eax,%espsubl$12,%esppushl$.LC0callputsaddl$16,%espmovl$0,%eaxleaveret.sizemain,.-main.ident"GCC:(GNU)4.0.020050519(RedHat4.0.0-8)".section.note.GNU-stack,"",@progbits匯編階段匯編階段是把編譯階段生成的“.s”文件轉(zhuǎn)成目標(biāo)文件。GCC中,可以使用選項(xiàng)“-c”將匯編代碼轉(zhuǎn)化為以“.o”結(jié)尾的二進(jìn)制目標(biāo)代碼。[root@localhostgcc#gcc–chello.s–ohello.o注:由于hello.o為二進(jìn)制文件,不能用文本編輯器打開(kāi);如果用文本編輯器強(qiáng)制打開(kāi),顯示為一堆亂碼。鏈接階段上面生成的hello.o并沒(méi)有定義“printf”函數(shù)的實(shí)現(xiàn),而預(yù)編譯中包含進(jìn)的“stdio.h”中也只有該函數(shù)的聲明,無(wú)該函數(shù)的實(shí)現(xiàn)。那么,是在哪里實(shí)現(xiàn)“printf”函數(shù)的呢?通俗的講,鏈接就是找到函數(shù)的實(shí)現(xiàn)處,也就是函數(shù)庫(kù)。而函數(shù)庫(kù)按時(shí)間、空間需求可分為靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)鏈接階段靜態(tài)庫(kù):指編譯鏈接時(shí),把庫(kù)文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件比較大,但在運(yùn)行時(shí)也就不再需要庫(kù)文件,其后綴名一般為“.a”。(“以空間換時(shí)間”)動(dòng)態(tài)庫(kù):在鏈接時(shí)并沒(méi)有把庫(kù)文件的代碼加入到可執(zhí)行文件中,因而生成的文件比較小,但在程序執(zhí)行時(shí)需要?jiǎng)討B(tài)加載庫(kù)文件的代碼,其后綴名一般為“.so”。(“以時(shí)間換空間”)鏈接階段在GCC中,“printf”函數(shù)實(shí)現(xiàn)被放到名為“l(fā)ibc.so.6”的庫(kù)文件中,它是一個(gè)動(dòng)態(tài)庫(kù)。在沒(méi)有特別指定時(shí),GCC會(huì)到系統(tǒng)默認(rèn)的搜索路徑“/usr/lib”下進(jìn)行查找,也就是鏈接到libc.so.6庫(kù)函數(shù)中去,這樣就能實(shí)現(xiàn)函數(shù)“printf”,而這也就是鏈接的作用。GCC編譯實(shí)際源程序編譯過(guò)程中,不需要分步運(yùn)行上述命令來(lái)生成可執(zhí)行文件,可以利用下面命令一步到位,生成可執(zhí)行文件hello。[root@localhostgcc]#gcc–Shello.i–ohello.s運(yùn)行生成的可執(zhí)行文件hello,得到運(yùn)行結(jié)果:[root@localhostgcc]#./helloHello!Thisisourembeddedworld!常用的GCC編譯選項(xiàng)選項(xiàng)含義-E只進(jìn)行預(yù)編譯,不做其他處理-c只編譯不鏈接,生成目標(biāo)文件“.o”-S只編譯不匯編,生成匯編代碼-ofile指定輸出文件名稱(chēng)為file-g在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息-v打印出編譯器內(nèi)部編譯各過(guò)程的命令行信息和編譯器的版本-Idir在頭文件的搜索路徑列表中添加dir目錄-Ldir在庫(kù)文件的搜索路徑列表中添加dir目錄-static鏈接靜態(tài)庫(kù)-llibrary鏈接名為library的庫(kù)文件告警和出錯(cuò)輔助選項(xiàng)選項(xiàng)含義-ansi支持符合ANSI標(biāo)準(zhǔn)的C程序-pedantic允許發(fā)出ANSIC標(biāo)準(zhǔn)所列的全部警告信息-pedantic-error允許發(fā)出ANSIC標(biāo)準(zhǔn)所列的全部錯(cuò)誤信息-w關(guān)閉所有告警-Wall允許發(fā)出GCC提供的所有有用的報(bào)警信息-werror把所有的告警信息轉(zhuǎn)化為錯(cuò)誤信息,并在告警發(fā)生時(shí)終止編譯過(guò)程/03Gdb調(diào)試器Gdb調(diào)試Linux下C程序開(kāi)發(fā)主要用到的調(diào)試工具是Gdb調(diào)試器。Gdb是一款由GNU開(kāi)發(fā)并發(fā)布的自由軟件,是UNIX/Linux下的功能強(qiáng)大的程序調(diào)試工具。雖然,它沒(méi)有圖形化的友好界面,但是它強(qiáng)大的功能也足以與微軟的VC工具等媲美。一般來(lái)說(shuō),Gdb主要提供以下功能:(1)設(shè)置斷點(diǎn)(可以是條件表達(dá)式),使程序在指定的代碼上暫停執(zhí)行。(2)單步執(zhí)行程序,便于調(diào)試。(3)查看程序中變量值的變化。(4)動(dòng)態(tài)改變程序執(zhí)行環(huán)境。(5)分析崩潰產(chǎn)生的core文件。Gdb的調(diào)用Gdb的使用非常簡(jiǎn)單,只要在Linux的命令提示符下輸入gdb,系統(tǒng)便會(huì)啟動(dòng)Gdb,并打印出Gdb的相關(guān)信息。也可以在gdb后面給出文件名,直接指定想要測(cè)試的程序,Gdb就會(huì)自動(dòng)調(diào)用這個(gè)可執(zhí)行文件進(jìn)行調(diào)試,命令格式如下:注:為了使Gdb正常工作,程序在編譯的時(shí)候必須包含調(diào)試信息,這需要在GCC編譯時(shí)加上-g或者-ggdb選項(xiàng)。[root@localhostGdb]#gdbGNUgdb(Ubuntu7.11.1-0ubuntu1~16.5)7.11.1Copyright(C)2016FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlater<http:gnu="gnu">Thisisfreesoftware:youarefreetochangeandredistributeit.ThereisNOWARRANTY,totheextentpermittedbylaw.Type"showcopying"and"showwarranty"fordetails.ThisGDBwasconfiguredas"x86_64-linux-gnu".Type"showconfiguration"forconfigurationdetails.Forbugreportinginstructions,pleasesee:<http:///software/gdb/bugs/>.FindtheGDB

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論