Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第6章 大數(shù)據(jù)挖掘的shell基礎(chǔ)_第1頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第6章 大數(shù)據(jù)挖掘的shell基礎(chǔ)_第2頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第6章 大數(shù)據(jù)挖掘的shell基礎(chǔ)_第3頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第6章 大數(shù)據(jù)挖掘的shell基礎(chǔ)_第4頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第6章 大數(shù)據(jù)挖掘的shell基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩88頁(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)介

Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用6大數(shù)據(jù)挖掘的shell基礎(chǔ)第章本章內(nèi)容6.1大數(shù)據(jù)開(kāi)發(fā)的shell基礎(chǔ)6.2

shell的模式和類(lèi)型6.3shell編程6.4應(yīng)用案例:shell編程的數(shù)據(jù)挖掘6.5本章小結(jié)6.1大數(shù)據(jù)開(kāi)發(fā)的shell基礎(chǔ)Shell就是一種腳本語(yǔ)言,是將用戶(hù)與linux之間溝通的橋梁,我們?cè)谶M(jìn)行大數(shù)據(jù)開(kāi)發(fā)中將會(huì)與linux進(jìn)行多次的交流,所以shell命令的編程就顯得尤為的重要,Shell是一種比較簡(jiǎn)單而且易學(xué)的腳本語(yǔ)言,并且它本身是一個(gè)用c語(yǔ)言編寫(xiě)的程序,它是用戶(hù)使用Linux的橋梁。shell既是一種命令語(yǔ)言,又是一種程序設(shè)計(jì)語(yǔ)言。用戶(hù)的大部分工作是通過(guò)shell完成的。作為命令語(yǔ)言,它互動(dòng)式地解釋和執(zhí)行用戶(hù)輸入的命令;作為程序設(shè)計(jì)語(yǔ)言,它定義了各種變量和參數(shù),并提供了許多在高階語(yǔ)言中才具有的控制結(jié)構(gòu),包括循環(huán)和分支。它雖然不是Linux系統(tǒng)內(nèi)核的一部分,但它調(diào)用了系統(tǒng)內(nèi)核的大部分功能來(lái)執(zhí)行程序、創(chuàng)建文檔并以并行的方式協(xié)調(diào)各個(gè)程序的運(yùn)行。因此,對(duì)用戶(hù)來(lái)說(shuō),shell是最重要的實(shí)用程序,深入了解和熟練掌握shell的特性及其使用方法,是用好Linux系統(tǒng)的關(guān)鍵。可以說(shuō),shell使用的熟練度反映了用戶(hù)對(duì)Linux使用的熟練程度。6.1大數(shù)據(jù)開(kāi)發(fā)的shell基礎(chǔ)當(dāng)用戶(hù)使用Linux時(shí)是通過(guò)命令來(lái)完成所需工作的。一個(gè)命令就是用戶(hù)和shell之間對(duì)話(huà)的一個(gè)基本單位,它是由多個(gè)字符組成并以換行結(jié)束的字串。Shell解釋用戶(hù)輸入的命令,就像DOS里的一樣,不同的是,在DOS中,只有一個(gè),而在Linux下比較流行的shell有多個(gè),每個(gè)shell都各有特點(diǎn)。一般的Linux系統(tǒng)都將bash作為默認(rèn)的shell。6.1大數(shù)據(jù)開(kāi)發(fā)的shell基礎(chǔ)我們進(jìn)一步的來(lái)講shell是一種命令行解釋器,我們可以利用shell命令把一些內(nèi)容進(jìn)行輸出,shell一般有幾種對(duì)應(yīng)的命令去實(shí)現(xiàn)不同的用途,就像我們?cè)?jīng)學(xué)習(xí)過(guò)的C,java一樣,我們?cè)诰庉嬈髦惺褂貌煌拇a來(lái)實(shí)現(xiàn)自己的需求,shell與它們的用途是一樣的,只是我們這里講的shell與它們的編譯運(yùn)行環(huán)境不一樣,我們這里是將shell放到ubuntu中去實(shí)現(xiàn),如圖6-1:

圖6-1輸出HelloWorld通過(guò)shell命令6.1大數(shù)據(jù)開(kāi)發(fā)的shell基礎(chǔ)Shell本身是一個(gè)用C語(yǔ)言編寫(xiě)的程序,它是用戶(hù)使用Unix/Linux的橋梁,用戶(hù)的大部分工作都是通過(guò)Shell完成的。Shell既是一種命令語(yǔ)言,又是一種程序設(shè)計(jì)語(yǔ)言。作為命令語(yǔ)言,它交互式地解釋和執(zhí)行用戶(hù)輸入的命令;作為程序設(shè)計(jì)語(yǔ)言,它定義了各種變量和參數(shù),并提供了許多在高級(jí)語(yǔ)言中才具有的控制結(jié)構(gòu),包括循環(huán)和分支。6.2shell的模式和類(lèi)型6.2.1shell的運(yùn)行模式1、交互式:解釋執(zhí)行用戶(hù)的命令,用戶(hù)輸入一條命令,shell就解釋執(zhí)行一條,交互式shell就是在終端上進(jìn)行運(yùn)行的,shell等待輸入,然后對(duì)你所提交的命令進(jìn)行執(zhí)行,這種模式被稱(chēng)為交互模式,是因?yàn)閟hell與用戶(hù)進(jìn)行交互。我們的正常的使用方式登入、執(zhí)行、一些命令、退出。當(dāng)我們退出后命令的執(zhí)行也會(huì)停止,還有一種方式是非交互式,6.2.1shell的運(yùn)行模式2、批處理:用戶(hù)事先寫(xiě)一個(gè)shell腳本,其中有很多條命令,讓shell一次把這些命令執(zhí)行完,而不必一條一條的敲指令。Shell腳本和編程語(yǔ)言很相似,也有變量和流程控制語(yǔ)句,但shell腳本是解釋執(zhí)行的,不需要編譯shell程序從腳本中一行一行讀取并執(zhí)行這些命令,相當(dāng)于一個(gè)用戶(hù)把腳本中的命令一行一行敲到shell提示符下執(zhí)行。Shell初學(xué)者注意,在平常應(yīng)用中,建議不要用root賬號(hào)運(yùn)行shell。作為普通用戶(hù),無(wú)論有意無(wú)意,都無(wú)法破壞系統(tǒng);但是root只要敲幾個(gè)字母,就可能導(dǎo)致嚴(yán)重后果。Shell的三種運(yùn)行方式:首先建立一個(gè)文本文件,在文本中寫(xiě)入,如圖6-2:#!/bin/shcd/tmpecho"hello,world!"

圖6-2使用shell語(yǔ)言寫(xiě)入腳本6.2.1shell的運(yùn)行模式三種執(zhí)行方法:第一種運(yùn)行模式:因?yàn)閟hell命令寫(xiě)完是沒(méi)有執(zhí)行權(quán)的,所以使用chmod命令賦予其執(zhí)行權(quán)限,如圖6-3:6.2.1shell的運(yùn)行模式第二種運(yùn)行模式:調(diào)用解釋器使腳本運(yùn)行,如圖6-4:6.2.1shell的運(yùn)行模式第三種運(yùn)行模式:使用source命令進(jìn)行運(yùn)行,如圖6-5:。6.2.1shell的運(yùn)行模式在腳本的第一行有cd命令,這是一個(gè)改變工作目錄的命令,可是使用第一種和第二種放大執(zhí)行腳本后當(dāng)前的工作目錄并沒(méi)有改變(腳本所在的目錄是shell文件夾,腳本執(zhí)行后,使用pwd命令顯示出當(dāng)前的工作目錄還是shell),使用第三種方法執(zhí)行后當(dāng)前的工作目錄就改變了,進(jìn)入了tmp中。出現(xiàn)這種情況是系統(tǒng)本身執(zhí)行腳本的方式不同所造成的!前兩種方法執(zhí)行腳本時(shí)系統(tǒng)會(huì)創(chuàng)建一個(gè)子進(jìn)程或者說(shuō)子shell來(lái)執(zhí)行腳本,原來(lái)的進(jìn)程就是父進(jìn)程或者說(shuō)父shell,整個(gè)過(guò)程中父進(jìn)程會(huì)等待子進(jìn)程執(zhí)行完畢,然后子進(jìn)程退出,父進(jìn)程也退出。cd命令確實(shí)被執(zhí)行了,但是僅僅是在子進(jìn)程中改變了工作目錄,所以腳本執(zhí)行完后使用pwd顯示工作目錄并沒(méi)有改變。而第三種方法執(zhí)行的shell腳本的話(huà)并不創(chuàng)建子進(jìn)程,就是在原來(lái)的進(jìn)程中執(zhí)行,所以最后的工作目錄改變了。6.2.2shell的類(lèi)型Linux上常見(jiàn)的shell解析器有bash、sh、csh、ksh等,習(xí)慣上把他們稱(chēng)作一種shell。我們常說(shuō)有多少種shell,其實(shí)說(shuō)的是腳本解析器。Shell是一種用C語(yǔ)言編寫(xiě)的程序(命令解析器),是用戶(hù)連接Unix/Linux內(nèi)核的橋梁,它通過(guò)調(diào)用系統(tǒng)核心的大部分功能的形式向用戶(hù)隱藏了系統(tǒng)的底層細(xì)節(jié),它通過(guò)建立文件的形式并行的運(yùn)行多個(gè)程序,來(lái)幫助用戶(hù)完成很多工作。Shell既是一種命令語(yǔ)言,又是一種程序設(shè)計(jì)語(yǔ)言。作為命令語(yǔ)言,它類(lèi)似于Windows下的cmd.exe,可以交互式地解釋和執(zhí)行用戶(hù)輸入的命令;作為程序設(shè)計(jì)語(yǔ)言,它定義了各種變量和參數(shù),并提供了許多在高級(jí)語(yǔ)言中才具有的控制結(jié)構(gòu),但是Shell是不需要進(jìn)行編譯的,它是從腳本程序中一行一行的讀取并執(zhí)行命令。6.2.2shell的類(lèi)型Shell是Linux學(xué)習(xí)過(guò)程中很重要的一部分,它有兩種執(zhí)行命令的方式:交互式,用戶(hù)輸入一條命令,Shell就解釋執(zhí)行一條;批處理,用戶(hù)事先寫(xiě)一個(gè)Shell腳本,其中有很多條命令,讓Shell一次把這些命令執(zhí)行完,而不必一條一條地敲命令。我們可以通過(guò)etc/shells/目錄下來(lái)查看shell的全部類(lèi)型,如圖6-6:6.2.2shell的類(lèi)型sh或者稱(chēng)作BourneShell:最初的shell并且仍然在UNIX系統(tǒng)和UNIX相關(guān)系統(tǒng)中使用。它是基本的shell,是一個(gè)特性不多的小程序。雖然不是一個(gè)標(biāo)準(zhǔn)的shell,但是為了UNIX程序的兼容性在每一個(gè)Linux系統(tǒng)上仍然存在。

bash或者稱(chēng)作BourneAgainshell:標(biāo)準(zhǔn)的GNUshell,直觀(guān)而且靈活。內(nèi)部命令一共有40個(gè)?;蛟S是初學(xué)者的最明智的選擇同時(shí)對(duì)高級(jí)和專(zhuān)業(yè)用戶(hù)來(lái)說(shuō)也是一個(gè)強(qiáng)有力的工具。在Linux上,bash是普通用戶(hù)的標(biāo)準(zhǔn)shell。這個(gè)shell因此被稱(chēng)為Bourneshell的超集,一套附件和插件。意味著bash和sh是兼容的:在sh中可以工作的命令,在bash中也能工作,反之則不然。6.2.2shell的類(lèi)型可以使用類(lèi)似DOS下面的doskey的功能,用方向鍵查閱和快速輸入并修改命令:1、自動(dòng)通過(guò)查找匹配的方式給出以某字符串開(kāi)頭的命令。2、包含了自身的幫助功能,你只要在提示符下面輸入help就可以得到相關(guān)幫助。csh或者稱(chēng)作Cshell:語(yǔ)法類(lèi)似于C語(yǔ)言,是Linux比較大的內(nèi)核,它是以WilliamJoy為代表的共計(jì)47位作者編成,共有52個(gè)內(nèi)部命令。該shell其實(shí)是指向/bin/tcsh這樣的一個(gè)shell,也就是說(shuō)csh其實(shí)就是tcsh。Tcsh或者稱(chēng)作TurboCshell:普通Cshell的超集,加強(qiáng)了的用戶(hù)友好度和速度。ash是由KennethAlmquist編寫(xiě)的,Linux中占用系統(tǒng)資源最少的一個(gè)小shell,它只包含24個(gè)內(nèi)部命令,因而使用起來(lái)很不方便。ksh或者稱(chēng)作Kornshell:由EricGisin編寫(xiě),共有42條內(nèi)部命令。該shell最大的優(yōu)點(diǎn)是幾乎和商業(yè)發(fā)行版的ksh完全兼容,這樣就可以在不用花錢(qián)購(gòu)買(mǎi)商業(yè)版本的情況下嘗試商業(yè)版本的性能了。ksh是Bourneshell的一個(gè)超集,有這對(duì)初學(xué)者來(lái)說(shuō)是一場(chǎng)噩夢(mèng)的標(biāo)準(zhǔn)配置。6.2.2shell的類(lèi)型 注意:bash是BourneAgainShell的縮寫(xiě),是Linux標(biāo)準(zhǔn)的默認(rèn)shell,它基于Bourneshell,吸收了Cshell和Kornshell的一些特性。Bash完全兼容sh,也就是說(shuō),用sh寫(xiě)的腳本可以不加修改的在bash中執(zhí)行。6.3shell編程shell是操作系統(tǒng)的最外層。shell合并編程語(yǔ)言以控制進(jìn)程和文件,以及啟動(dòng)和控制其它程序。shell通過(guò)提示您輸入,向操作系統(tǒng)解釋該輸入,然后處理來(lái)自操作系統(tǒng)的任何結(jié)果輸出來(lái)管理您與操作系統(tǒng)之間的交互。6.3.1bash簡(jiǎn)介Bash不僅僅是一個(gè)命令解析程序。它本身?yè)碛幸环N程序設(shè)計(jì)語(yǔ)言,使用這種語(yǔ)言,可以編寫(xiě)shell腳本來(lái)完成各種各樣的工作,而這些工作是使用現(xiàn)成的命令所無(wú)法完成的,Bash腳本可以使用if-then-elif-else-fi語(yǔ)句,for語(yǔ)句,while語(yǔ)句,until語(yǔ)句,break和continue命令,以及case語(yǔ)句,結(jié)合Bash中各種各樣的條件測(cè)試語(yǔ)句,從而動(dòng)態(tài)決定你的腳本實(shí)際運(yùn)行的分支及動(dòng)作,達(dá)到靈活及強(qiáng)大的處理功能。bash是一個(gè)為GNU項(xiàng)目編寫(xiě)的Unixshell。它的名字是Bourne-AgainShell,這是關(guān)于Bourneshell(sh)的一個(gè)雙關(guān)語(yǔ),Bourneshell是一個(gè)早期的重要shell,由StephenBourne在1978年前后編寫(xiě)的,并同Version7Unix一起發(fā)布。bash則在1987年由BrianFox創(chuàng)造。在1990年,ChetRamey成為了主要的維護(hù)者。bash是大多數(shù)Linux系統(tǒng)以及MacOSXv10.4默認(rèn)的shell,它能運(yùn)行于大多數(shù)Unix風(fēng)格的操作系統(tǒng)之上,甚至被移植到了MicrosoftWindows上的Cygwin和MSYS系統(tǒng)中,以實(shí)現(xiàn)Windows的POSIX虛擬接口。此外它也被DJGPP項(xiàng)目移植到了MS-DOS上。6.3.1bash簡(jiǎn)介1、語(yǔ)法與特性bash的命令語(yǔ)法是Bourneshell命令語(yǔ)法的超集。數(shù)量龐大的Bourneshell,不經(jīng)修改即可以在bash中執(zhí)行,只有那些引用了Bourne特殊變量或使用了Bourne的內(nèi)置命令腳本才需要修改。bash的命令語(yǔ)法很多來(lái)自Kornshell(ksh)和Cshell(csh),例如命令行編輯,命令歷史,目錄棧,$RANDOM和$PPID變量,以及POSIX的命令置換語(yǔ)法:$(…)。作為一個(gè)交互式的shell,按下TAB鍵即可自動(dòng)補(bǔ)全一部分輸入的程序名,文件名,變量名等,bash的語(yǔ)法針對(duì)Bourneshell的不足做了很多擴(kuò)展。其中一些舉例在這里。6.3.1bash簡(jiǎn)介2、使用整數(shù)與Bourneshell不同的是bash不用另外生成進(jìn)程即能進(jìn)行整數(shù)運(yùn)算。bash使用((…))命令和$[…]變量語(yǔ)法來(lái)達(dá)到這個(gè)目的:VAR=55#將整數(shù)55賦值給變量VAR((VAR=VAR+1))#變量VAR加1。注意這里沒(méi)有'$'((++VAR))#另一種方法給VAR加1。使用C語(yǔ)言風(fēng)格的前綴自增((VAR++))#另一種方法給VAR加1。使用C語(yǔ)言風(fēng)格的后綴自增echo$[VAR*22]#VAR乘以22并將結(jié)果送入命令echo$((VAR*22))#同上((…))命令可以用于條件語(yǔ)句,因?yàn)樗耐顺鰻顟B(tài)是由0或者非0(大多數(shù)情況下是1),可以用于是與非的條件判斷:if((VAR==y*3+x*2))thenechoyesfi((z>20))&&echoyes((…))命令支持下列比較操作符:'==','!=','>','<','>=',和'<=',bash不能在自身進(jìn)程內(nèi)進(jìn)行浮點(diǎn)數(shù)運(yùn)算。當(dāng)前有這個(gè)能力的Unixshell只有Kornshell和Zshell。6.3.1bash簡(jiǎn)介3、輸入輸出重定向表6-1輸入輸出重定向的命令bash擁有傳統(tǒng)Bourneshell缺乏的I/O重定向語(yǔ)法。bash可以同時(shí)重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,這需要使用下面的語(yǔ)法,如表6-1:command&>filecommand>file將輸出重定向到file。command<file將輸入重定向到file。command>>file將輸出以追加的方式重定向到filen>file將文件描述符為n的文件重定向到file。n>>file將文件描述符為n的文件以追加的方式重定向到file。n>&m將輸出文件m和n合并。n<&m將輸入文件m和n合并。<<tag將開(kāi)始標(biāo)記tag和結(jié)束標(biāo)記tag之間的內(nèi)容作為輸入。6.3.1bash簡(jiǎn)介【例題6-1】使用執(zhí)行下面的who命令,它將命令的完整的輸出重定向在用戶(hù)文件中(users),如圖6-7:

圖6-7輸出重定向這比等價(jià)的Bourneshell語(yǔ)法"command>file2>&1"來(lái)的簡(jiǎn)單。2.05b版本以后,bash可以用下列語(yǔ)法重定向標(biāo)準(zhǔn)輸出至至字符串文件,寫(xiě)數(shù)據(jù),關(guān)閉文件,重置標(biāo)準(zhǔn)輸入至字符串(稱(chēng)為herestring):Command<<<"stringtobereadasstandardinput"6.3.2shell命令行Shell是系統(tǒng)的用戶(hù)界面,提供了用戶(hù)與內(nèi)核進(jìn)行交互操作的一種接口。它接收用戶(hù)輸入的命令并把它送入內(nèi)核去執(zhí)行。實(shí)際上Shell是一個(gè)命令解釋器,它解釋由用戶(hù)輸入的命令并且把它們送到內(nèi)核。不僅如此,Shell有自己的編程語(yǔ)言用于對(duì)命令的編輯,它允許用戶(hù)編寫(xiě)由shell命令組成的程序。Shell編程語(yǔ)言具有普通編程語(yǔ)言的很多特點(diǎn),比如它也有循環(huán)結(jié)構(gòu)和分支控制結(jié)構(gòu)等,用這種編程語(yǔ)言編寫(xiě)的Shell程序與其他應(yīng)用程序具有同樣的效果。6.3.2shell命令行Shell腳本的語(yǔ)句一般是要在文本編輯器中進(jìn)行實(shí)現(xiàn),打開(kāi)文本編輯器,新建一個(gè)文件,擴(kuò)展名為sh(sh代表shell),擴(kuò)展名并不影響腳本執(zhí)行。Shell也能當(dāng)解譯性的程序語(yǔ)言,Shell程序,通常叫做命令文件,它由列在檔案內(nèi)的命令所構(gòu)成。此程序在編輯器中編輯(雖然也可以直接在命令列下寫(xiě)作程序,由UNIX命令和基本的程序結(jié)構(gòu),例如變量的指定、測(cè)試條件、和循環(huán)所構(gòu)成。您不需要編譯shell命令檔。Shell本身會(huì)解譯命令檔中的每一行,就如同由鍵盤(pán)輸入一樣。shell負(fù)責(zé)解譯命令,而使用者則必須了解這些命令能做什么。下面列出了一些有用的命令行中常見(jiàn)的符號(hào)和它們的使用方法。6.3.2shell命令行Shell命令行中的常見(jiàn)的操作:1、$:shell提示符,如果最后一個(gè)字符是"#",表示當(dāng)前終端會(huì)話(huà)有超級(jí)用戶(hù)權(quán)限。使用root用戶(hù)登錄或者使用能提供超級(jí)用戶(hù)權(quán)限的終端能獲得該權(quán)限,如圖6-8。

圖6-8獲得超級(jí)權(quán)限6.3.2shell命令行2、自動(dòng)補(bǔ)全:自動(dòng)補(bǔ)齊可以應(yīng)用于路徑名、變量(以$開(kāi)頭的單詞)、用戶(hù)名(以~開(kāi)頭)、命令(單詞時(shí)命令行第一個(gè)單詞)、主機(jī)名,如表6-2:

表6-2自動(dòng)補(bǔ)全的使用命令作用Alt-$顯示所有可能項(xiàng)。等價(jià)于按兩次TabAlt-*插入所有可能匹配項(xiàng)6.3.2shell命令行3、命令行歷史:history命令直接輸出歷史記錄,默認(rèn)500個(gè),使用的命令如表6-3:表6-3命令行歷史命令作用Ctrl-P移動(dòng)到前一條歷史記錄,等于上箭頭Ctrl-N移動(dòng)到后一條歷史記錄,等于下箭頭Alt-<移動(dòng)到歷史記錄開(kāi)始處Alt->移動(dòng)到歷史記錄末尾處,即當(dāng)前命令行Alt-P非遞增搜索。輸入搜索串后鍵入Enter才開(kāi)始搜索Alt-N向前非遞增搜索Ctrl-O執(zhí)行歷史記錄項(xiàng),執(zhí)行完后跳到下一項(xiàng)。用于執(zhí)行一系列歷史記錄Ctrl-R逆向遞增搜索歷史記錄;搜索時(shí)查找下一個(gè)匹配項(xiàng)Ctrl-J把搜索內(nèi)容復(fù)制到當(dāng)前命令行(按左右方向鍵也能復(fù)制,若按Enter會(huì)立即執(zhí)行命令)Ctrl-G或C退出搜索!!重復(fù)最后一個(gè)命令,等價(jià)于上箭頭+Enter!number執(zhí)行歷史記錄第number行的命令!string執(zhí)行最近的以string開(kāi)頭的歷史記錄!?string執(zhí)行最近的包含string的歷史記錄6.3.2shell命令行4、復(fù)制粘貼:linux中的復(fù)制粘貼是與windows是不同的,那么在linux中就不能使用ctrl-v和ctrl-c,如表6-4:

表6-4復(fù)制粘貼復(fù)制粘貼鼠標(biāo)左鍵選擇文本(或雙擊選擇單詞)鼠標(biāo)中鍵Ctrl-Shift-cCtrl-Shift-vCtrl-InsertShift-Insert6.3.2shell命令行5、通配符:稱(chēng)為wildcards或globbing,用于匹配一組文件名。可與任意一個(gè)使用文件名做參數(shù)的命令一起使用,注意:謹(jǐn)慎使用字符范圍表示法[A-Z][a-z],如表6-5:

表6-5通配符的類(lèi)別通配符匹配項(xiàng)*匹配任意多個(gè)字符(包含0個(gè))?匹配任意一個(gè)字符(不包含0個(gè))[characters]匹配任意一個(gè)字符集內(nèi)字符[!characters]匹配任意一個(gè)不屬于字符集內(nèi)字符[[:class:]]匹配任意一個(gè)字符類(lèi)內(nèi)字符6.3.2shell命令行6、重定向:

表6-6重定向的使用命令command>file將輸出重定向到

file。command<file將輸入重定向到

file。command>>file將輸出以追加的方式重定向到

file。n>file將文件描述符為

n的文件重定向到

file。n>>file將文件描述符為

n的文件以追加的方式重定向到

file。n>&m將輸出文件

m和

n合并。n<&m將輸入文件

m和

n合并。<<tag將開(kāi)始標(biāo)記tag和結(jié)束標(biāo)記

tag之間的內(nèi)容作為輸入。6.3.2shell命令行7、命令行擴(kuò)展:每次shell命令執(zhí)行前都會(huì)進(jìn)行擴(kuò)展(expansion)。通過(guò)echo可以簡(jiǎn)單驗(yàn)證擴(kuò)展后的結(jié)果。這些擴(kuò)展包括: 路徑名擴(kuò)展(使用通配符) 波浪線(xiàn)擴(kuò)展(~或~user,擴(kuò)展為用戶(hù)的主目錄) 算術(shù)擴(kuò)展,$((expression)),注意都是整數(shù)運(yùn)算,支持四則和取余”%”,取冪”**”,忽略空格 花括號(hào)擴(kuò)展$echo{1..5}輸出12345$echo{G..A}輸出GFEDCBA$echo{A{1,2},B{3,4}}輸出A1A2B3B4

參數(shù)擴(kuò)展,如$PATH等參數(shù) 命令替換,如$(ls)或`ls`6.3.2shell命令行8、引用:引用可以避免Shell擴(kuò)展。引用包含雙引號(hào)的弱引用和單引號(hào)的強(qiáng)引用,弱引用:部分特殊字符失去特殊含義,保留美元符號(hào)”$”,反斜線(xiàn)”\”,反引號(hào)”`”。因此,單詞分隔、路徑名擴(kuò)展、波浪線(xiàn)擴(kuò)展和花括號(hào)擴(kuò)展失效。參數(shù)擴(kuò)展、算術(shù)擴(kuò)展、命令替換依然有效;強(qiáng)引用:抑制所有擴(kuò)展。轉(zhuǎn)義字符”\”:在弱引用中輸出”$”、”\”、”`”或輸出轉(zhuǎn)義字符”\n”等。在命令行中消除shell特殊字符的含義,如”$”、”!”、”&”、空格。6.3.2shell命令行【例題6-2】輸入一下代碼,如圖6-9,6-10:#!/bin/bashecho"HelloWorld!"

圖6-9使用文本編輯器

圖6-10使用echo命令進(jìn)行輸出“#!”是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來(lái)執(zhí)行,其實(shí)哪一種shell命令用于向窗口輸出文本。6.3.2shell命令行運(yùn)用shell腳本有兩種方法,如下:1、作為可執(zhí)行程序?qū)⑸厦娴拇a保存為text.sh,并cd到相應(yīng)的目錄:chmod+x./test.sh#使腳本具有執(zhí)行權(quán)限./test.sh#執(zhí)行腳本

注意,一定要寫(xiě)成./test.sh,而不是text.sh。運(yùn)用其他二進(jìn)制的程序也一樣,直接寫(xiě)text.sh,Linux系統(tǒng)會(huì)去PATH里尋找有沒(méi)有叫test.sh的,而只有/bin,/sbin,/user/sbin,/user/bin等在PATH里,你的當(dāng)前目錄通常不在PATH里,所以寫(xiě)成text.sh是會(huì)找不到命令的,要用./test.sh告訴系統(tǒng)說(shuō),就在當(dāng)前目錄找。通過(guò)這種方式運(yùn)行bash腳本,第一行一定要寫(xiě)對(duì),好讓系統(tǒng)查找到正確的解釋器,這里的“系統(tǒng)”,其實(shí)就是shell這個(gè)應(yīng)用程序(想象一下WindowsExplorer),但寫(xiě)成系統(tǒng)方便理解,既然這個(gè)系統(tǒng)就是指shell,那么使用一個(gè)/bin/sh作為解釋器腳本是不是可以省去第一行呢?是的。6.3.2shell命令行2、作為解釋其參數(shù)這種運(yùn)行方式是,直接運(yùn)行解釋器,其參數(shù)就是shell腳本的文件名,如:/bin/shtest.sh/bin/phptest.php這種方式運(yùn)行的腳本,不需要在第一行制定解釋器信息。6.3.2shell命令行【例題6-3】如何解釋其參數(shù)#!/bin/bash#Author:cancan#Copyright(c)hppt:///cpp/linux/#Scriptfollowshere:echo"Whatisyourname?"echo"Hello,$Hadoop"運(yùn)行腳本:$./test.shWhatisyourname?CancanHello,canan上面腳本使用read命令從stdin獲取輸入并賦值給PERSON變量,最后在stdout上輸出。6.3.3shell腳本語(yǔ)句和命令Shell是一個(gè)用C語(yǔ)言編寫(xiě)的程序,它是用戶(hù)使用Linux的橋梁。Shell既是一種命令語(yǔ)言,又是一種程序設(shè)計(jì)語(yǔ)言。Shell腳本(shellscript),是一種為shell編寫(xiě)的腳本程序,shell腳本語(yǔ)句包括很多種語(yǔ)句,例如,進(jìn)行參數(shù)傳遞的語(yǔ)句、讀取數(shù)組的語(yǔ)句、流程控制語(yǔ)句,函數(shù)調(diào)用語(yǔ)句。shell腳本語(yǔ)言Shell是指一種應(yīng)用程序,這個(gè)應(yīng)用程序提供了一個(gè)界面,用戶(hù)通過(guò)這個(gè)界面訪(fǎng)問(wèn)操作系統(tǒng)內(nèi)核的服務(wù)。1、參數(shù)傳遞語(yǔ)句我們可以在執(zhí)行Shell腳本時(shí),向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:$n,n代表一個(gè)數(shù)字,1為執(zhí)行腳本的第一個(gè)參數(shù),2為執(zhí)行腳本的第二個(gè)參數(shù),以此類(lèi)推……,我們通過(guò)在文本編輯器中進(jìn)行寫(xiě)入內(nèi)容,然后在終端進(jìn)行操作和參數(shù)的傳遞。shell腳本語(yǔ)言例題6-4】向腳本進(jìn)行參數(shù)的傳遞#!/bin/bash#author:hadoopecho"Shell傳遞參數(shù)實(shí)例!";echo"執(zhí)行的文件名:$0";echo"第一個(gè)參數(shù)為:$1";echo"第二個(gè)參數(shù)為:$2";echo"第三個(gè)參數(shù)為:$3";在gedit編輯器中應(yīng)該先創(chuàng)建一個(gè)空的文本,然后寫(xiě)入?yún)?shù)傳遞語(yǔ)句,如圖6-11:圖6-11參數(shù)傳遞語(yǔ)句的寫(xiě)入shell腳本語(yǔ)言然后,我們通過(guò)終端進(jìn)行輸出文本文檔中的參數(shù)語(yǔ)句,輸出結(jié)果,如圖6-12:

圖6-12終端參數(shù)輸出shell腳本語(yǔ)言在輸出參數(shù)的同時(shí),我們還需要特殊字符來(lái)處理參數(shù),通過(guò)特殊的字符來(lái)對(duì)輸入的參數(shù)進(jìn)行處理,如果直接將參數(shù)進(jìn)行傳遞,那么,當(dāng)我們進(jìn)行傳遞的時(shí)候?qū)⒂锌赡芊祷劐e(cuò)誤的值,如表6-7。

表6-7處理參數(shù)的字符參數(shù)處理說(shuō)明$#傳遞到腳本的參數(shù)個(gè)數(shù)$*以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)。

如"$*"用「"」括起來(lái)的情況、以"$1$2…$n"的形式輸出所有參數(shù)。$$腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)$!后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)$@與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。

如"$@"用「"」括起來(lái)的情況、以"$1""$2"…"$n"的形式輸出所有參數(shù)。$-顯示Shell使用的當(dāng)前選項(xiàng),與set命令功能相同。$?顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。shell腳本語(yǔ)言如果我們?cè)谏弦粋€(gè)例子中加入處理符號(hào),那么應(yīng)該是這樣的,如表6-13,6-14:【例題6-5】有處理符號(hào)參與的參數(shù)傳遞

圖6-13有處理符號(hào)參與的參數(shù)傳遞

圖6-14終端輸出傳遞的參數(shù)那么,我們由例題可以看出$*與$@之間是有區(qū)別的:相同點(diǎn):都是用來(lái)引用所有的參數(shù)。不同點(diǎn):只有在雙引號(hào)中體現(xiàn)出來(lái)。假設(shè)在腳本運(yùn)行時(shí)寫(xiě)了三個(gè)參數(shù)1、2、3,,則"*"等價(jià)于"123"(傳遞了一個(gè)參數(shù)),而"@"等價(jià)于"1""2""3"(傳遞了三個(gè)參數(shù))。shell腳本語(yǔ)言【例題6-6】如圖6-15:#!/bin/bash#author:hadoop echo"--\$*演示---"foriin"$*";doecho$idoneecho"--\$@演示---"foriin"$@";doecho$idone運(yùn)行結(jié)果:

圖6-15參數(shù)傳遞shell腳本語(yǔ)言2、數(shù)組語(yǔ)句在Linux平臺(tái)上工作,我們經(jīng)常需要使用shell來(lái)編寫(xiě)一些有用、有意義的腳本程序。有時(shí),會(huì)經(jīng)常使用shell數(shù)組。那么,shell中的數(shù)組是怎么表現(xiàn)的呢,又是怎么定義的呢?接下來(lái)逐一的進(jìn)行講解,shell中的數(shù)組何為數(shù)組?學(xué)過(guò)計(jì)算機(jī)編程語(yǔ)言的同學(xué)都知道,數(shù)組的特性就是一組數(shù)據(jù)類(lèi)型相同的集合(不包括有一些編程語(yǔ)言提出來(lái)的關(guān)聯(lián)數(shù)組的概念)。那么shell中數(shù)組是怎么定義的呢,我們來(lái)看兩種數(shù)據(jù)類(lèi)型:一是數(shù)值類(lèi)型,二是字符串類(lèi)型;雖然shell本身是弱類(lèi)型的,但也可以這么區(qū)分,數(shù)組中可以存放多個(gè)值。BashShell只支持一維數(shù)組(不支持多維數(shù)組),初始化時(shí)不需要定義數(shù)組大小(與PHP類(lèi)似),與大部分編程語(yǔ)言類(lèi)似,數(shù)組元素的下標(biāo)由0開(kāi)始。shell腳本語(yǔ)言Shell數(shù)組用括號(hào)來(lái)表示,元素用"空格"符號(hào)分割開(kāi),語(yǔ)法格式如下:array_name=(value1...valuen)在我們使用數(shù)組的時(shí)候,我們首先需要給數(shù)組先進(jìn)行賦值,賦值語(yǔ)法如下:arr=(abc)arr[index]=a在文本編輯器中應(yīng)該如下圖:(第一種定義方式),如圖6-16:

圖6-16數(shù)組的定義shell腳本語(yǔ)言第二種定義方式,如圖6-17:

圖6-17數(shù)組的定義方式我們將我們需要的內(nèi)容寫(xiě)入數(shù)組,那么下面我們需要讀取我們數(shù)組中所寫(xiě)的內(nèi)容:${array_name[index]}shell腳本語(yǔ)言【例題6-7】數(shù)組的簡(jiǎn)單使用,如圖6-18:#!/bin/bash#author:hadoopmy_array=(AB"C"D)echo"第一個(gè)元素為:${my_array[0]}"echo"第二個(gè)元素為:${my_array[1]}"echo"第三個(gè)元素為:${my_array[2]}"echo"第四個(gè)元素為:${my_array[3]}“運(yùn)行結(jié)果:

圖6-18數(shù)組的使用在我們使用數(shù)組的時(shí)候,我們有時(shí)候會(huì)需要使用數(shù)組中的全部元素,在終端會(huì)有全部元素的輸出,使用@或*可以獲取數(shù)組中的所有元素。shell腳本語(yǔ)言【例題6-8】獲取數(shù)組中的全部元素,如圖6-19:#!/bin/bash my_array[0]=Amy_array[1]=Bmy_array[2]=Cmy_array[3]=Decho"數(shù)組的元素為:${my_array[*]}"echo"數(shù)組的元素為:${my_array[@]}"運(yùn)行結(jié)果:

圖6-19獲取全部元素Shell數(shù)組跟java中的數(shù)組相似,都是需要獲取數(shù)組的長(zhǎng)度的,把數(shù)組的長(zhǎng)度用在迭代中,作為限制條件。shell腳本語(yǔ)言【例題6-9】獲取數(shù)組的長(zhǎng)度,如圖6-20:#!/bin/bashmy_array[0]=A//在數(shù)組中進(jìn)行賦值my_array[1]=Bmy_array[2]=Cmy_array[3]=Decho"數(shù)組元素個(gè)數(shù)為:${#my_array[*]}"http://通過(guò)索引進(jìn)行輸出數(shù)組中的值echo"數(shù)組元素個(gè)數(shù)為:${#my_array[@]}"

運(yùn)行結(jié)果:

圖6-20獲取數(shù)組的長(zhǎng)度shell腳本語(yǔ)言3、shell中常用的運(yùn)算符Shell和其他編程語(yǔ)言一樣,支持多種運(yùn)算符,包括:算數(shù)運(yùn)算符、關(guān)系運(yùn)算符、布爾運(yùn)算符、字符串運(yùn)算符、文件測(cè)試運(yùn)算符,原生bash不支持簡(jiǎn)單的數(shù)學(xué)運(yùn)算,但是可以通過(guò)其他命令來(lái)實(shí)現(xiàn),例如awk和expr,expr最常用,expr是一款表達(dá)式計(jì)算工具,使用它能完成表達(dá)式的求值操作。例如,當(dāng)我們兩個(gè)數(shù)進(jìn)行相加的時(shí)候,如下:#!/bin/bashval=`expr2+2`echo"兩數(shù)之和為:$val"shell腳本語(yǔ)言在shell中我們也和其他的編程語(yǔ)言一樣,需要算術(shù)運(yùn)算符,如表6-8:

表6-8算術(shù)運(yùn)算符運(yùn)算符說(shuō)明舉例+加法`expr$a+$b`結(jié)果為

30。-減法`expr$a-$b`結(jié)果為

-10。*乘法`expr$a\*$b`結(jié)果為

200。/除法`expr$b/$a`結(jié)果為

2。%取余`expr$b%$a`結(jié)果為

0。=賦值a=$b將把變量

b的值賦給

a。==相等。用于比較兩個(gè)數(shù)字,相同則返回

true。[$a==$b]返回

false。!=不相等。用于比較兩個(gè)數(shù)字,不相同則返回

true。[$a!=$b]返回

true。shell腳本語(yǔ)言【例題6-10】算術(shù)運(yùn)算符的使用,如圖6-21:#!/bin/bash a=10b=20val=`expr$a+$b`echo"a+b:$val"val=`expr$a-$b`echo"a-b:$val"val=`expr$a\*$b`echo"a*b:$val"val=`expr$b/$a`echo"b/a:$val"val=`expr$b%$a`echo"b%a:$val"if[$a==$b]thenecho"a等于b"fiif[$a!=$b]thenecho"a不等于b"fishell腳本語(yǔ)言運(yùn)行結(jié)果:

圖6-21算術(shù)運(yùn)算符的使用 注意:乘號(hào)(*)前邊必須加反斜杠(\)才能實(shí)現(xiàn)乘法運(yùn)算;if...then...fi是條件語(yǔ)句,后續(xù)將會(huì)講解,shell的expr語(yǔ)法是:$((表達(dá)式)),此處表達(dá)式中的"*"不需要轉(zhuǎn)義符號(hào)"\"。shell腳本語(yǔ)言關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字,如下表列出了常用的關(guān)系運(yùn)算符,假定變量a為10,變量b為20,如表6-9:

表6-9關(guān)系運(yùn)算符運(yùn)算符說(shuō)明舉例-eq檢測(cè)兩個(gè)數(shù)是否相等,相等返回

true。[$a-eq$b]返回

false。-ne檢測(cè)兩個(gè)數(shù)是否相等,不相等返回

true。[$a-ne$b]返回

true。-gt檢測(cè)左邊的數(shù)是否大于右邊的,如果是,則返回

true。[$a-gt$b]返回

false。-lt檢測(cè)左邊的數(shù)是否小于右邊的,如果是,則返回

true。[$a-lt$b]返回

true。-ge檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是,則返回

true。[$a-ge$b]返回

false。-le檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是,則返回

true。[$a-le$b]返回

true。shell腳本語(yǔ)言【例題6-11】關(guān)系運(yùn)算符的使用,如圖6-22:

#!/bin/basha=10 b=20if[$a-eq$b]//用if判斷語(yǔ)句進(jìn)行判斷返回真假值thenecho"$a-eq$b:a等于b"elseecho"$a-eq$b:a不等于b"fiif[$a-ne$b]thenecho"$a-ne$b:a不等于b"http://echo輸出語(yǔ)句進(jìn)行輸出elseecho"$a-ne$b:a等于b"fiif[$a-gt$b]thenecho"$a-gt$b:a大于b"elseecho"$a-gt$b:a不大于b"http://輸出判斷后的結(jié)果fiif[$a-lt$b]thenecho"$a-lt$b:a小于b"elseecho"$a-lt$b:a不小于b"fishell腳本語(yǔ)言運(yùn)行結(jié)果:

圖6-22關(guān)系運(yùn)算符的使用我們通常在shell的編程中還會(huì)使用到邏輯運(yùn)算符來(lái)實(shí)現(xiàn),通過(guò)使用邏輯運(yùn)算符來(lái)比較兩個(gè)變量之間的關(guān)系,假定變量a為10,變量b為20:如表6-10:

表6-10邏輯運(yùn)算符運(yùn)算符說(shuō)明舉例&&邏輯的

AND[[$a-lt100&&$b-gt100]]返回

false||邏輯的

OR[[$a-lt100||$b-gt100]]返回

trueshell腳本語(yǔ)言【例題6-12】邏輯運(yùn)算符的使用,如圖6-23:#!/bin/basha=10b=20if[[$a-lt100&&$b-gt100]]//用if語(yǔ)句判斷thenecho"返回true"elseecho"返回false"fiif[[$a-lt100||$b-gt100]]thenecho"返回true"http://用echo輸出判斷結(jié)果elseecho"返回false"Fi運(yùn)行結(jié)果:

圖6-23邏輯運(yùn)算符的使用shell腳本語(yǔ)言4、shell控制語(yǔ)句我們學(xué)過(guò)很多種語(yǔ)言都是會(huì)有流程控制語(yǔ)句,流程控制語(yǔ)句就是將我們想要循環(huán)的內(nèi)容進(jìn)行循環(huán),通過(guò)語(yǔ)句來(lái)進(jìn)行次數(shù)的控制,把我們想要的內(nèi)容進(jìn)行實(shí)現(xiàn),但是,和Java、PHP等語(yǔ)言不一樣,sh的流程控制不可為空,如(以下為PHP流程控制寫(xiě)法):<?phpif(isset($_GET["q"])){search(q);}else{//不做任何事情}If語(yǔ)句的使用格式:ifconditionthencommand1command2...commandNfishell腳本語(yǔ)言Ifelse語(yǔ)句的使用格式:ifconditionthencommand1command2...commandNelsecommandfiIfelseifelse語(yǔ)句的使用格式:ifcondition1thencommand1elifcondition2thencommand2elsecommandNfishell腳本語(yǔ)言【例題6-13】if語(yǔ)句的使用,如圖6-24:a=10b=20if[$a==$b]//用if語(yǔ)句進(jìn)行判斷thenecho"a等于b"http://用echo輸出語(yǔ)句elif[$a-gt$b]thenecho"a大于b"elif[$a-lt$b]thenecho"a小于b"elseecho"沒(méi)有符合的條件"fishell腳本語(yǔ)言運(yùn)行結(jié)果:圖6-24if語(yǔ)句的使用for循環(huán)的一般格式:forvarinitem1item2...itemNdocommand1command2...commandNdone當(dāng)變量值在列表里,for循環(huán)即執(zhí)行一次所有命令,使用變量名獲取列表中的當(dāng)前取值,命令可為任何有效的shell命令和語(yǔ)句。in列表可以包含替換、字符串和文件名,in列表是可選的,如果不用它,for循環(huán)使用命令行的位置參數(shù)。shell腳本語(yǔ)言【例題6-14】for循環(huán)的使用,如圖6-25:forloopin12345doecho"Thevalueis:$loop"done運(yùn)行結(jié)果:

圖6-25for循環(huán)的使用shell腳本語(yǔ)言while循環(huán)用于不斷執(zhí)行一系列命令,也用于從輸入文件中讀取數(shù)據(jù);命令通常為測(cè)試條件。其格式為:whileconditiondocommanddone下面是一個(gè)基本的while循環(huán),測(cè)試條件是:如果int小于等于5,那么條件返回真。int從0開(kāi)始,每次循環(huán)處理時(shí),int加1。運(yùn)行上述腳本,返回?cái)?shù)字1到5,然后終止。shell腳本語(yǔ)言【例題6-15】while循環(huán)的使用,如圖6-26:#!/bin/shint=1while(($int<=5))//用while語(yǔ)句進(jìn)行判斷doecho$intlet"int++"done運(yùn)行結(jié)果:

圖6-26while循環(huán)的使用shell腳本語(yǔ)言使用中使用了Bashlet命令,它用于執(zhí)行一個(gè)或多個(gè)表達(dá)式,變量計(jì)算中不需要加上$來(lái)表示變量。until循環(huán)執(zhí)行一系列命令直至條件為真時(shí)停止,until循環(huán)與while循環(huán)在處理方式上剛好相反,一般while循環(huán)優(yōu)于until循環(huán),但在某些時(shí)候—也只是極少數(shù)情況下,until循環(huán)更加有用。until的格式如下:untilconditiondocommanddoneshell腳本語(yǔ)言Shellcase語(yǔ)句為多選擇語(yǔ)句。可以用case語(yǔ)句匹配一個(gè)值與一個(gè)模式,如果匹配成功,執(zhí)行相匹配的命令。case語(yǔ)句格式如下:case值in 模式1)command1command2...commandN;;模式2)

command1command2...commandN;;esaccase工作方式如上所示。取值后面必須為單詞in,每一模式必須以右括號(hào)結(jié)束。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開(kāi)始執(zhí)行直至;;。取值將檢測(cè)匹配的每一個(gè)模式。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式。如果無(wú)一匹配模式,使用星號(hào)*捕獲該值,再執(zhí)行后面的命令。shell腳本語(yǔ)言【例題6-16】case的使用,如圖6-27:echo'輸入1到4之間的數(shù)字:' echo'你輸入的數(shù)字為:'//用echo輸出readaNumcase$aNumin1)echo'你選擇了1';;2)echo'你選擇了2';;3)echo'你選擇了3'//echo輸出

;;4)echo'你選擇了4';;*)echo'你沒(méi)有輸入1到4之間的數(shù)字';;esac運(yùn)行結(jié)果:

圖6-27case的使用shell腳本語(yǔ)言在我們進(jìn)行一系列的循環(huán)的時(shí)候,當(dāng)遇到異常情況的時(shí)候是需要在循環(huán)中退出,那么我們就需要在循環(huán)中退出,所以我們就需要使用跳出循環(huán)的語(yǔ)句break和continue。break命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))。 shell腳本語(yǔ)言【例題6-17】break命令的使用,如圖6-28:#!/bin/bashwhile:doecho-n"輸入1到5之間的數(shù)字:"http://用echo輸出

readaNum

case$aNumin1|2|3|4|5)echo"你輸入的數(shù)字為$aNum!";;*)echo"你輸入的數(shù)字不是1到5之間的!游戲結(jié)束"break;;esacdone 運(yùn)行結(jié)果:

圖6-28break命令的使用continue命令與break命令類(lèi)似,只有一點(diǎn)差別,它不會(huì)跳出所有循環(huán),僅僅跳出當(dāng)前循環(huán)。shell腳本語(yǔ)言【例題6-18】continue命令的使用,如圖6-29:#!/bin/bashwhile:doecho-n"輸入1到5之間的數(shù)字:"http://用echo輸出

readaNumcase$aNumin1|2|3|4|5)echo"你輸入的數(shù)字為$aNum!";;*)echo"你輸入的數(shù)字不是1到5之間的!"continueecho"游戲結(jié)束";;esacdoneshell腳本語(yǔ)言運(yùn)行結(jié)果:

圖6-29continue命令的使用shell命令Shell命令主要是用來(lái)實(shí)現(xiàn)將腳本語(yǔ)句與操作系統(tǒng)之間進(jìn)行結(jié)合的,使用shell的命令對(duì)于文本中的腳本語(yǔ)句進(jìn)行在終端的實(shí)現(xiàn),把shell中命令與腳本內(nèi)容相互得到實(shí)現(xiàn),使用命令在終端使用,輸出腳本語(yǔ)句。主要有三種命令:echo命令、printf命令、test命令。shell命令1、echo命令Shell的echo指令與PHP的echo指令類(lèi)似,都是用于字符串的輸出。命令格式:echostring1、顯示普通字符串:echo"Itisatest"這里的雙引號(hào)完全可以省略,以下命令與上面實(shí)例效果一致:echoItisatest2、顯示轉(zhuǎn)義字符echo"\"Itisatest\""3.顯示變量read命令從標(biāo)準(zhǔn)輸入中讀取一行,并把輸入行的每個(gè)字段的值指定給shell變量#!/bin/shreadnameecho"$nameItisatest"4.顯示換行echo-e"OK!\n"#-e開(kāi)啟轉(zhuǎn)義echo"Ititatest"5、顯示不換行shell命令【例題6-20】如圖6-31:#!/bin/shecho-e"OK!\c"#-e開(kāi)啟轉(zhuǎn)義\c不換行echo"Itisatest"運(yùn)行結(jié)果:6.顯示結(jié)果定向至文件echo"Itisatest">myfile7.原樣輸出字符串,不進(jìn)行轉(zhuǎn)義或取變量(用單引號(hào))echo'$name\"'8、顯示命令執(zhí)行結(jié)果 如圖6-32:echo`date`shell命令2、printf命令printf命令模仿C程序庫(kù)(library)里的printf()程序,標(biāo)準(zhǔn)所定義,因此使用printf的腳本比使用echo移植性好,printf使用引用文本或空格分隔的參數(shù),外面可以在printf中使用格式化字符串,還可以制定字符串的寬度、左右對(duì)齊方式等。默認(rèn)printf不會(huì)像echo自動(dòng)添加換行符,我們可以手動(dòng)添加\n。printf命令的語(yǔ)法:printfformat-string[arguments...]$echo"Hello,Shell"Hello,Shell$printf"Hello,Shell\n"Hello,Shell$printf命令的使用,如圖6-33:#!/bin/bashprintf"%-10s%-8s%-4s\n"姓名性別體重kgprintf"%-10s%-8s%-4.2f\n"郭靖男66.1234printf"%-10s%-8s%-4.2f\n"楊過(guò)男48.6543printf"%-10s%-8s%-4.2f\n"郭芙女47.9876運(yùn)行結(jié)果:shell命令%s%c%d%f都是格式替代符,%-10s指一個(gè)寬度為10個(gè)字符(-表示左對(duì)齊,沒(méi)有則表示右對(duì)齊),任何字符都會(huì)被顯示在10個(gè)字符寬的字符內(nèi),如果不足則自動(dòng)以空格填充,超過(guò)也會(huì)將內(nèi)容全部顯示出來(lái),%-4.2f指格式化為小數(shù),其中.2指保留2位小數(shù)。shell命令例題6-21】如圖6-34:#!/bin/bash#format-string為雙引號(hào)printf"%d%s\n"1"abc"#單引號(hào)與雙引號(hào)效果一樣printf'%d%s\n'1"abc"#沒(méi)有引號(hào)也可以輸出printf%sabcdef#格式只指定了一個(gè)參數(shù),但多出的參數(shù)仍然會(huì)按照該格式輸出,format-string被重用printf%sabcdefprintf"%s\n"abcdefprintf"%s%s%s\n"abcdefghij#如果沒(méi)有arguments,那么%s用NULL代替,%d用0代替printf"%sand%d\n"運(yùn)行結(jié)果:shell命令序列說(shuō)明\a警告字符,通常為ASCII的BEL字符\b后退\c抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且,任何留在參數(shù)里的字符、任何接下來(lái)的參數(shù)以及任何留在格式字符串中的字符,都被忽略\f換頁(yè)(formfeed)\n換行\(zhòng)r回車(chē)(Carriagereturn)\t水平制表符\v垂直制表符\\一個(gè)字面上的反斜杠字符\ddd表示1到3位數(shù)八進(jìn)制值的字符。僅在格式字符串中有效\0ddd表示1到3位的八進(jìn)制值字符shell命令3、test命令Shell中的test命令用于檢查某個(gè)條件是否成立,它可以進(jìn)行數(shù)值、字符和文件三個(gè)方面的測(cè)試。參數(shù)說(shuō)明-eq等于則為真-ne不等于則為真-gt大于則為真-ge大于等于則為真-lt小于則為真-le小于等于則為真shell命令例題6-22】數(shù)值測(cè)試,如圖6-35:num1=100num2=100iftest$[num1]-eq$[num2]thenecho'兩個(gè)數(shù)相等!'elseecho'兩個(gè)數(shù)不相等!'fi運(yùn)行結(jié)果:shell命令參數(shù)說(shuō)明=等于則為真!=不相等則為真-z字符串字符串的長(zhǎng)度為零則為真-n字符串字符串的長(zhǎng)度不為零則為真shell命令【例題6-23】如圖6-36:num1="ru1noob"num2="runoob"iftest$num1=$num2thenecho'兩個(gè)字符串相等!'elseecho'兩個(gè)字符串不相等!'fi運(yùn)行結(jié)果:6.4應(yīng)用案例:shell編程的數(shù)據(jù)挖掘Shell是一個(gè)命令行界面的解析器,它的作用就是遵循一定的語(yǔ)法將輸入的命令加以解釋然后傳給系統(tǒng),為用戶(hù)提供了一個(gè)向Linux發(fā)送請(qǐng)求以便運(yùn)行程序的接口系統(tǒng),用戶(hù)可以用shell來(lái)啟動(dòng)、掛起、停止甚至是編寫(xiě)一些程序。Shell是一個(gè)用C語(yǔ)言編寫(xiě)的程序,它是使用Linux的橋梁。Shell既是一種命令語(yǔ)言,又是一種程序設(shè)計(jì)語(yǔ)言。Shell是一個(gè)命令行界面的解析器,它的作用就是遵循一定的語(yǔ)法將輸入的命令加以解釋然后傳給系統(tǒng),為用戶(hù)提供了一個(gè)向Linux發(fā)送請(qǐng)求以便運(yùn)行程序的接口系統(tǒng),用戶(hù)可以用shell來(lái)啟動(dòng)、掛起、停止甚至是編寫(xiě)一些程序。它雖然不是Linux系統(tǒng)內(nèi)核的一部分,但它調(diào)用了系統(tǒng)內(nèi)核的大部分功能來(lái)執(zhí)行程序、創(chuàng)建文檔并

溫馨提示

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