shell腳本教程詳細(xì)講解(很好)_第1頁(yè)
shell腳本教程詳細(xì)講解(很好)_第2頁(yè)
shell腳本教程詳細(xì)講解(很好)_第3頁(yè)
shell腳本教程詳細(xì)講解(很好)_第4頁(yè)
shell腳本教程詳細(xì)講解(很好)_第5頁(yè)
已閱讀5頁(yè),還剩75頁(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)介

CollegeofInformationScienceandEngineeringShandongAgriculturalUniversitySHELL腳本編程

2021/5/91 shell腳本能提高用戶(hù)操作和管理員進(jìn)行系統(tǒng)管理的效率,一般步驟編輯器編寫(xiě)腳本程序shell做解釋程序,非交互地執(zhí)行腳本,兩種執(zhí)行方式:用sh命令執(zhí)行腳本文件給腳本文件添加執(zhí)行權(quán)限,用./命令執(zhí)行2021/5/92HELLOWORLD!vihello.sh按i進(jìn)入插入模式輸入echo“helloworld!”:輸入wq保存退出shhello.sh或者

chmod755hello.sh ./hello.sh2021/5/93一、VI編輯器VI的三種工作模式VI的啟動(dòng)VI的退出VI的文本編輯VI命令模式下的操作VI行命令模式下的操作

VI編輯器的使用2021/5/94系統(tǒng)配置文件、shell腳本文件等都是文本文件,編輯它們都要使用文本編輯器。在Linux系統(tǒng)中有多種文本編輯器,其中既有字符界面如的VI、EMACAS等,也有圖形界面的如“附件”菜單下的“文本編輯器(gedit)”等,用戶(hù)可以根據(jù)自己的喜好選擇使用。學(xué)習(xí)vi的方法:

vi的命令太多且難以記憶,而實(shí)際上真正經(jīng)常使用的命令并不是太多,只要掌握幾個(gè)關(guān)鍵的并加以適當(dāng)練習(xí)很快就上手使用vi。2021/5/95為什么選擇VI就使用的方便性而言,有比vi更好的編輯器,還要圖形化的edit,為什么還要用vi?歷史久遠(yuǎn),功能強(qiáng)大,在有些情況下系統(tǒng)中能夠找到的編輯器只有vi;用戶(hù)一旦熟悉后,使用非常方便;系統(tǒng)管理員使用正則表達(dá)式可以極大地提高工作效率,而學(xué)習(xí)vi也是掌握正則表達(dá)式的有效途徑。由于vi的版本不同,其命令格式、功能和用法會(huì)有一些差別。Shell中執(zhí)行vi命令,RedHat系統(tǒng)實(shí)際上是執(zhí)行vim,它是傳統(tǒng)vi的增強(qiáng)版本2021/5/961、VI的三種工作模式命令模式啟動(dòng)VI默認(rèn)進(jìn)入命令模式。此時(shí)界面不能編輯,只能接受命令(鍵入的命令看不到)文件的保存,退出,文本的刪除、復(fù)制、搜索等操作輸入模式編輯模式命令模式下用i(sert),a(ppend),o,s等均可進(jìn)入該模式。按esc返回命令模式行編輯模式實(shí)際上也是命令模式的一種,在命令模式下輸入冒號(hào)進(jìn)入一個(gè)命令行,可顯示地輸入命令(所以也有些書(shū)認(rèn)為是兩種工作模式)。三種模式可自由切換,一般切換命令就是操作的英文單詞的首字母2021/5/972、VI的啟動(dòng)啟動(dòng)命令:vimy.txt如果文件存在,則vi顯示文件內(nèi)容并等待用戶(hù)的命令。如果指定的文件不存在,則vi將告知用戶(hù)這是未命名的文件,并進(jìn)入一個(gè)空白的界面。啟動(dòng)vi時(shí)都是默認(rèn)處于命令模式。用戶(hù)必須使用命令切換到文本輸入模式才能進(jìn)行輸入編輯,或者可執(zhí)行刪除、復(fù)制等編輯命令。vi–Rfile_name,以只讀方式打開(kāi)文件2021/5/983、VI的退出冒號(hào)進(jìn)命令行模式下::q!不存檔強(qiáng)制退出。:w保存但不退出,w(rite)后可加所要存檔的文檔名。:wq存檔后退出。命令模式下按zz,功能與

:wq相同。:x與:wq相同命令模式: ZZ、ZQ 保存/不保存退出2021/5/994、怎么編輯 必須從命令模式轉(zhuǎn)入插入模式才能進(jìn)行輸入編輯,可用命令有:新增

(append)a:從光標(biāo)所在位置后面開(kāi)始新增資料A:

從光標(biāo)所在行最后面的地方開(kāi)始新增資料。插入

(insert)i:

從光標(biāo)所在位置前面開(kāi)始插入資料I:從光標(biāo)所在行的第一個(gè)非空白字元前面開(kāi)始插入資料。開(kāi)始

(open)o:在光標(biāo)所在行下新增一列并進(jìn)入輸入模式。

O:在光標(biāo)所在行上方新增一列并進(jìn)入輸入模式。冒號(hào)進(jìn)入行命令模式,輸入setnu可設(shè)置vi顯示行號(hào)2021/5/9105、命令模式下的操作:刪除與修改x:

刪除光標(biāo)所在字符dw刪除一個(gè)單詞dd:刪除光標(biāo)所在的行s:刪除光標(biāo)所在字節(jié),并進(jìn)入輸入模式

#表示數(shù)字#x刪除幾個(gè)字符,如3x#dw刪除幾個(gè)單詞,如3dw表示刪除三個(gè)單詞#dd刪除多個(gè)行,如3dd表示刪除光標(biāo)行及光標(biāo)的下兩行d$刪除光標(biāo)到行尾的內(nèi)容d光標(biāo)鍵:左:刪除光標(biāo)前面的字符;右:刪除光標(biāo)所在的字符;上:將當(dāng)前行與上一行刪除;下:當(dāng)前行與下一行刪除nd上下光標(biāo)鍵:刪除當(dāng)前行之上、下的幾行文本(包括當(dāng)前行)u:恢復(fù)剛才被修改的文本U:恢復(fù)光標(biāo)所在行的所有修改.:重復(fù)上一次命令的操作2021/5/911命令模式下的操作:文本復(fù)制、粘貼復(fù)制命令:yyy:復(fù)制整行yw:復(fù)制光標(biāo)所在的單詞nyw:復(fù)制包括光標(biāo)所在的n個(gè)單詞nyy:復(fù)制包括當(dāng)前行在內(nèi)的n行粘貼命令P光標(biāo)移動(dòng)h、j、k、lnG:移動(dòng)到底n行行首2021/5/9126、行命令模式下的操作:字符串的查找、替換:/string 搜索指定的字符串。按鍵n:繼續(xù)進(jìn)行搜索如果寫(xiě)的是斜杠(/):按n會(huì)從當(dāng)前位置向后查找;如果寫(xiě)的是問(wèn)號(hào)(?),按n鍵則從當(dāng)前位置向前查找查找且替換:%s/SEARCH/REPLACE 把文檔中所有SEARCH替換成REPLACE;:#,#s/SEARCH/REPLACE/g

#號(hào)表示數(shù)字,表示從多少行到多少行,把SEARCH替換成REPLACE;:s/SEARCH/REPLACE/g 把當(dāng)前光標(biāo)所在行中的SEARCH單詞,替換成REPLACE,并把所有SEARCH高亮顯示2021/5/9137、設(shè)置vi全局的配置文件位于/etc/vim/vimrc(或者/etc/vimrc)也可以擁有自己獨(dú)立的配置文件,配置文件位“~/.vimrc”,如果沒(méi)有該文件,也可以直接用如下命令創(chuàng)建并編輯比如:setnu‘顯示行號(hào)setruler‘顯示光標(biāo)位置setundolevel‘顯示光標(biāo)位置setsmartindent‘智能縮進(jìn)syntaxon(或synon)‘語(yǔ)法高亮2021/5/914文本輸入狀態(tài)命令狀態(tài)行編輯狀態(tài)按ESC鍵按A,I,S,C,O等命令按“:”鍵執(zhí)行非退出命令,如w三種模式間的轉(zhuǎn)換關(guān)系2021/5/915案例練習(xí)1.請(qǐng)?jiān)?tmp這個(gè)目錄下建立一個(gè)名為vitest的目錄;2.進(jìn)入vitest這個(gè)目錄當(dāng)中;3.將/etc/man.config拷貝到本目錄底下4.使用vi開(kāi)啟本目錄下的man.config這個(gè)檔案;5.在vi中設(shè)定一下行號(hào);6.移動(dòng)到第58行,向右移動(dòng)40個(gè)字符,請(qǐng)問(wèn)您看到的雙引號(hào)內(nèi)是什么目錄?7.移動(dòng)到第一行,并且向下搜尋一下“bzip2”這個(gè)字符串,請(qǐng)問(wèn)他在第幾行?8.接著下來(lái),我要將50到100行之間的man改為MAN,并且一個(gè)一個(gè)挑選是否需要修改,如何下達(dá)指令?9.修改完之后,突然反悔了,要全部復(fù)原,有哪些方法?10.我要復(fù)制51到60行這十行的內(nèi)容,并且貼到最后一行之后;11.刪除11到30行之間的20行;12.將這個(gè)文件另存成一個(gè)man.test.config的文件;13.到第29行,并且刪除15個(gè)字符;14.儲(chǔ)存后離開(kāi)2021/5/9161.mkdir/tmp/vitest2.cd/tmp/vitest3.cp/etc/man.config.4.viman.config5.:setnu6.先按下58G再按下40→會(huì)看到/dir/bin/foo這個(gè)字樣在雙引號(hào)內(nèi);7.先執(zhí)行1G或gg后,直接輸入/bzip28.直接執(zhí)行:50,100s/man/MAN/gc即可9.(1)簡(jiǎn)單的方法可以一直按u恢復(fù)到原始狀態(tài),(2)使用不儲(chǔ)存離開(kāi):q!之后,再重新讀取一次該文件;10.51G然后再10yy之后按下G到最后一行,再p粘貼10行11.11G之后,再給他20dd即可刪除20行了;12.:wman.test.config13.29G之后,再給他15x即可刪除15個(gè)字符;14.:wq!2021/5/917二、SHELL變量與語(yǔ)法Shell概述shell變量和符號(hào)shell控制流程語(yǔ)法shell中的輸出重定向腳本實(shí)例

SHELL變量與語(yǔ)法2021/5/9181、shell的基本元素(1)#!/bin/bash必須的,指出shell的類(lèi)型(2)#注釋?zhuān)?)變量(4)控制一、Shell概述一個(gè)shell腳本viclearup.sh#!/bin/bash#thisisclearcd/var/logcat/dev/null>/var/log/messages/dev/nullLinux中的無(wú)限大的垃圾回收站echo"Logscleanedup."2021/5/9192、一般步驟:(1)編輯文件(2)保存文件(3)將文件賦予可執(zhí)行的權(quán)限(4)運(yùn)行及排錯(cuò)2021/5/920注意:一般以.sh為文件后綴。沒(méi)有也能執(zhí)行。常見(jiàn)的兩種執(zhí)行方式./文件名 在當(dāng)前目錄下寫(xiě)明路徑執(zhí)行,要求文件必須有執(zhí)行權(quán)限,如chmod755run.sh./run.shsh文件名 shrun.sh文件開(kāi)頭指定一個(gè)或多個(gè)解釋腳本程序的shell,如 #!/bin/bash如果指定,注意/bin不要漏了“/”,否則用./方式執(zhí)行會(huì)找不到路徑。不指定的話(huà)一般默認(rèn)以/bin/sh執(zhí)行shell腳本2021/5/9213、Shell的一般結(jié)構(gòu)

shell類(lèi)型函數(shù)主過(guò)程一般模板abc.sh#!/bin/bashshell類(lèi)型#asimpleshellscriptexample#afunctionfuncitonsayhello()函數(shù){echo"EnterYourname:"readname讀取來(lái)自鍵盤(pán)輸入的變量echo"Hello$name"}echo"programmestartshere..."主過(guò)程sayhelloecho"programmeends."2021/5/9221、注釋符# 除了#!/bin/bash里的#特殊2、美元符$變量符。與反斜杠轉(zhuǎn)義符相反,使其后的普通字符作為變量名,如$a表示變量a的值。變量字符長(zhǎng)度超過(guò)1個(gè)時(shí),用{}括起來(lái)3、單引號(hào)被引起的字符全部做普通字符,即全部原樣 echo‘my$SHELL’二、Shell中的特殊符號(hào)2021/5/9234、雙引號(hào)引號(hào)內(nèi)的內(nèi)容,除$、轉(zhuǎn)義符\、倒引號(hào)`這三個(gè)保留特殊功能,其他字符均做普通字符。5、倒引號(hào)(數(shù)字1鍵旁邊的那個(gè)鍵)引號(hào)內(nèi)的字符串當(dāng)做shell命令行解釋執(zhí)行,得到的結(jié)果取代整個(gè)倒引號(hào)括起來(lái)的部分。`pwd` 即pwd命令的執(zhí)行結(jié)果$LOGNAME 系統(tǒng)變量2021/5/924練習(xí)一下:區(qū)別下面幾句echo‘myhomeis$HOME’echo“myhomeis$HOME”echo`myhomeis$HOME`echo“myhomeis`pwd`”echo‘myhomeis`pwd`’` 用于括起來(lái)shell命令‘ 用于原樣顯示2021/5/9256.反斜線(xiàn)反斜線(xiàn)是轉(zhuǎn)義字符,它能把特殊字符變成普通字符。在某個(gè)字符前面利用反斜杠(\)能夠阻止shell把后面的字符解釋為特殊字符。例4:[yuqun@yuqun~]$echo“FilenameisN0\$\*”FilenameisN0$*注意:在單引號(hào)括起來(lái)的字符串中,反斜線(xiàn)也成為普通字符,而失去轉(zhuǎn)義字符功能。2021/5/926三、變量shell變量可以保存如路徑名、文件名或者一個(gè)數(shù)字本地變量局部變量只在創(chuàng)建它們的Shell中使用,可以在shell程序內(nèi)任意使用和修改它們。環(huán)境變量可以在創(chuàng)建它們的Shell及其派生出來(lái)的任意子程序中使用。有些變量是用戶(hù)創(chuàng)建的,其他的則是專(zhuān)用的(比如PATH、HOME)。是系統(tǒng)環(huán)境的一部分,不必去定義它們,可以在shell程序中使用它們。還能在shell中加以修改。內(nèi)部變量由系統(tǒng)提供的。與環(huán)境變量不同,但用戶(hù)不能修改它們。2021/5/927本地變量和環(huán)境變量的對(duì)比2021/5/9281、本地變量(局部變量、用戶(hù)變量)本地變量在用戶(hù)現(xiàn)在的shell生命期的腳本中使用變量名=值注意:(1)等號(hào)兩邊不可以有空格(2)取值包含空格,必須用雙引號(hào)括起來(lái)(3)Shell變量可以用大小寫(xiě)字母,區(qū)分大小寫(xiě)2021/5/929變量的聲明和使用(1)變量是弱類(lèi)型的(不用聲明類(lèi)型)(2)變量聲明及賦值格式

變量=值(等號(hào)兩邊不能有空格)(3)變量的引用

$變量名

${變量名}

變量名為1個(gè)字符時(shí)建議使用方式一,多余一個(gè)字符時(shí)建議使用方式二舉例:$a${abc}

2021/5/930顯示變量

echo命令可以顯示單個(gè)變量取值,變量名前加$echo$Nameecho$nameecho$nameareecho${name}are輸出引用變量時(shí)加{}比較好2021/5/931清除變量

unset變量名舉例:echo${name}unsetname(注意:name前沒(méi)有$)顯示本地所有變量set2021/5/932設(shè)置只讀變量

設(shè)置變量時(shí),不想再改變其值,可以將之設(shè)為只讀變量變量名=值

readonly變量名2021/5/9332、環(huán)境變量環(huán)境變量用于所有用戶(hù)進(jìn)程(通常稱(chēng)為子進(jìn)程)。登陸進(jìn)程稱(chēng)為父進(jìn)程,通過(guò)pstree可以查看環(huán)境變量可以用于所有子程序,著包括編輯器、腳本和應(yīng)用舉例:via.sh#!/bin/bash#檢測(cè)環(huán)境變量

echo"家目錄是$HOME"

環(huán)境變量可以在命令行中設(shè)置,但用戶(hù)注銷(xiāo)時(shí)這些值將丟失環(huán)境變量均為大寫(xiě)必須用export命令導(dǎo)出2021/5/934設(shè)置環(huán)境變量

variable-name=valueexportvariable-name(環(huán)境變量名大寫(xiě))顯示環(huán)境變量

env可以看到所有的環(huán)境變量

echo$環(huán)境變量名(顯示一個(gè)變量)清除環(huán)境變量

unset環(huán)境變量名2021/5/935HOME:代表使用者的家目錄。cd~去到使用者的家目錄或者利用cd就可以直接回到使用者家目錄了。PS1:shell的主提示符SHELL:目前這個(gè)環(huán)境使用的SHELL是哪個(gè)程序?如果是bash的話(huà),預(yù)設(shè)是/bin/bashPWD:用戶(hù)當(dāng)前工作目錄的路徑。它指出用戶(hù)目前在Linux文件系統(tǒng)中處在什么位置。它是由Linux自動(dòng)設(shè)置的HISTSIZE:這個(gè)與“歷史命令”有關(guān),曾經(jīng)下達(dá)過(guò)的指令可以被系統(tǒng)記錄下來(lái),而記錄的“數(shù)目”則是由這個(gè)值來(lái)設(shè)定的。ENV:這個(gè)使用者所使用的個(gè)性化環(huán)境設(shè)置文件的讀取文件。MAIL:當(dāng)我們使用mail這個(gè)指令在收信時(shí),系統(tǒng)會(huì)去讀取的郵件信箱文件(mailbox)。PATH:就是執(zhí)行文件搜尋的路徑,目錄與目錄中間以冒號(hào)(:)分隔,由于文件的搜尋是依序由PATH的變量?jī)?nèi)的目錄來(lái)查詢(xún),所以,目錄的順序也是重要的喔。LANG:語(yǔ)系文件,很多數(shù)據(jù)都會(huì)用到他,當(dāng)出現(xiàn)編碼錯(cuò)誤的時(shí)候往往需要設(shè)置它,中文編碼是zh_CN.UTF82021/5/936PATH示例舉例:配置java環(huán)境變量可使任何目錄都能執(zhí)行javac命令(1)需要配置Java環(huán)境變量

JAVA_HOME(JDK存放的路徑)CLASSPATH(字節(jié)碼的位置,讓JVM知道要運(yùn)行的類(lèi)的字節(jié)碼放在哪)PATH(讓OS找到j(luò)avac等命令的存放的位置)(2)在Linux下配置它們

打開(kāi)終端

vi.bash_profile

在配置文件中追加內(nèi)容

JAVA_HOME=JDK存放位置

CLASSPATH=.(當(dāng)前目錄)

PATH=$JAVA_HOME/BIN:$PATH(不覆蓋原來(lái)的內(nèi)容,追加)

exportJAVA_HOMECLASSPATHPATH

保存,讓配置起作用(source.bash_profile或者注銷(xiāo))2021/5/937讓環(huán)境變量的修改在退出shell再次登錄時(shí)仍有效,需要在相關(guān)配置文件中修改Bash的初始化文件有:/etc/profile、~/.bash_profile、~/.bash_login、~/.profile、~/.bashrc、/etc/bashrc/etc/profile~/.bash_profile~/.bashrc/etc/bashrc~/.bash_login~/.profile2021/5/938/etc/profile存放一些全局(共有)變量,不管哪個(gè)用戶(hù),登錄時(shí)都會(huì)讀取該文件。通常設(shè)置一些Shell變量PATH,USER,HOSTNAME和HISTSIZE等~/.bash_profile:每個(gè)用戶(hù)都可使用該文件輸入專(zhuān)用于自己使用的shell信息,當(dāng)用戶(hù)登錄時(shí),該文件僅僅執(zhí)行一次!默認(rèn)情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶(hù)的.bashrc文件.

~/.bashrc:該文件包含專(zhuān)用于你的bashshell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開(kāi)新的shell時(shí),該該文件被讀取.

/etc/bashrc:為每一個(gè)運(yùn)行bashshell的用戶(hù)執(zhí)行此文件.當(dāng)bashshell被打開(kāi)時(shí),該文件被讀取.2021/5/939上述配置文件的作用1)登錄Linux先啟動(dòng)系統(tǒng)配置文件/etc/profile,并從/etc/profile.d目錄的配置文件中搜集shell的設(shè)置,為系統(tǒng)的每個(gè)用戶(hù)設(shè)置環(huán)境信息。2)用戶(hù)配置文件~/.bash_profile,每個(gè)用戶(hù)專(zhuān)用于自己使用的shell信息,僅用戶(hù)登錄時(shí)執(zhí)行一次! 默認(rèn)情況下,此文件通過(guò)腳本執(zhí)行同目錄下用戶(hù)的.bashrc文件。3)~/.bashrc文件包含專(zhuān)用于用戶(hù)bashshell的bash信息,登錄及每次打開(kāi)新的shell時(shí)都會(huì)執(zhí)行。里面又會(huì)調(diào)用/etc/bashrc2021/5/940設(shè)置用戶(hù)自己的環(huán)境變量在/home/user/.bash_profile中定義下句,會(huì)怎樣?aliasla=‘ls–a|grep“\.*”’答:user下次再登陸,其shell會(huì)自動(dòng)建立一個(gè)別名命令la,功能為查看當(dāng)前目錄下名字以.開(kāi)頭的文件。寫(xiě)在~/.bash_profile中,需重新登錄才能有效。除非運(yùn)行source.bash_profile使其立即有效。寫(xiě)在~/.bashrc中,則打開(kāi)新的終端中就有效區(qū)別:bash_profile只在會(huì)話(huà)開(kāi)始的時(shí)候讀取一次,而bashrc則每次打開(kāi)終端時(shí)都會(huì)讀取按照傳統(tǒng),定義的變量如PATH放到.bash_profile中,而像別名函數(shù)等放在.bashrc中,但是.bash_profile先于.bashrc讀取內(nèi)容,也可全放入.bashrc中習(xí)慣用各自的配置文件,編輯不需要root權(quán)限2021/5/9413、內(nèi)部變量?jī)?nèi)部變量是Linux所提供的一種特殊類(lèi)型的變量,這類(lèi)變量在程序中用來(lái)作出判斷。在shell程序內(nèi)這類(lèi)變量的值是不能修改的。部分內(nèi)部變量是:$#——傳送給shell程序的位置參數(shù)的數(shù)量$?——最后命令的完成碼或者在shell程序內(nèi)部執(zhí)行的shell程序(返回值)$0——shell程序的名稱(chēng)$*——調(diào)用shell程序時(shí)所傳送的全部參數(shù)的單字符串,“參數(shù)1”“參數(shù)2”…形式保存的參數(shù)2021/5/942$@ “參數(shù)1”“參數(shù)2”…形式保存的參數(shù)$n 第n個(gè)參數(shù)$$ 本程序的PID$! 上一個(gè)命令的PID2021/5/943使用shell預(yù)定義變量的腳本舉例2021/5/9444位置參數(shù)

(1)

位置參數(shù)及引用可以編寫(xiě)一個(gè)shell腳本,當(dāng)從命令行或者從其他shell腳本中調(diào)用它的時(shí)候,這個(gè)腳本接收若干參數(shù)。這些選項(xiàng)是通過(guò)Linux作為位置參數(shù)(positionalparameter)提供給shell程序的。在shell腳本中應(yīng)有變量,接收實(shí)參,這類(lèi)變量的名稱(chēng)很特別,分別是1,2,3,…,這類(lèi)變量稱(chēng)為位置變量。位置參數(shù)1存放在位置變量1中,位置參數(shù)2存放位置變量2中,……,在程序中可以使用$1,$2,……來(lái)訪(fǎng)問(wèn),舉例:2021/5/945(2)用set命令為位置參數(shù)賦值在shell程序中可以利用set命令為位置參數(shù)賦值或重新賦值。一般格式:set[參數(shù)表]說(shuō)明:該命令后面無(wú)參數(shù)時(shí),將顯示系統(tǒng)中的系統(tǒng)變量的值;如果有參數(shù)將分別給位置參數(shù)賦值。2021/5/946四、變量表達(dá)式1、條件判斷命令test testn1-參數(shù)n2(或–參數(shù)表達(dá)式)真返回0,假返回1。(1)整數(shù),比較運(yùn)算符見(jiàn)右表test1

–lt4

#判斷1<4echo$? #結(jié)果為0

·test語(yǔ)句的等價(jià)形式[1–lt4]可用中括號(hào)代替test,把表達(dá)式括起來(lái)實(shí)現(xiàn)判斷注意表達(dá)式與中括號(hào)間有空格。-lt 小于-le 小于等于-gt 大于-ge 大于等于-eq 等于-ne 不等于2021/5/947eg1:若輸入的參數(shù)x是正數(shù),顯示xnumberispositive2021/5/948(2)文件測(cè)試-f 存在且是普通文件-d 存在且是目錄-s 存在且字節(jié)數(shù)大于0-r 存在且可讀-w 存在且可寫(xiě)-x 存在且可執(zhí)行如:test-d“mydoc”判斷mydoc是否是目錄eg2:檢測(cè)從命令行輸入的文件是否存在2021/5/9493、字符串測(cè)試tests字符串s非空tests1=s2 字符串s1等于s2tests1!=s2 字符串s1不等于s2test-zs 字符串長(zhǎng)=0,即為空串test-n 字符串長(zhǎng)>04、其他參數(shù)-a 邏輯與-o 邏輯或! 邏輯非2021/5/9503、控制流程shell運(yùn)算符和C語(yǔ)言基本類(lèi)似,也有分支、循環(huán)流程控制。簡(jiǎn)單舉例 后面例子涉及的命令seq命令:產(chǎn)生1-9的數(shù)字序列比如seq14expr命令:對(duì)表達(dá)式求值[]直接求值命令:對(duì)被括起來(lái)的表達(dá)式求值2021/5/951表達(dá)式求值:$expr1+3$expr2–1$expr1\*3使用*要加轉(zhuǎn)義符$echo`expr1+3`注意:表達(dá)式中,數(shù)字和運(yùn)算符指教要有空格,出現(xiàn)在語(yǔ)句中要加反引號(hào)2021/5/9521)分支結(jié)構(gòu)if分支if[$#-eq0]then echo“輸入了0個(gè)參數(shù)”elif[$#-lt1]thenecho“輸入了多個(gè)參數(shù)”elseecho“輸入了1個(gè)參數(shù)”ficasecase“$#”

in0)echo“輸入了0個(gè)參數(shù)”

;; 1)echo“輸入了1個(gè)參數(shù)”

;; *)echo“輸入了多個(gè)參數(shù)”;;

esac每個(gè)分支條件后必須以?xún)蓚€(gè)分號(hào)結(jié)尾2021/5/9532)循環(huán)結(jié)構(gòu)for例子——輸出100內(nèi)10的倍數(shù) foriin`seq19` do echo`expr$i\*10` done或?qū)?echo$(expr$i\*10)乘號(hào)前加轉(zhuǎn)義符,與數(shù)字間要有空格。2021/5/954read變量1[變量2…]可以從鍵盤(pán)上讀取多個(gè)變量的值,用戶(hù)輸入數(shù)據(jù)時(shí),以空格或者Tab鍵作為分隔。如果輸入的數(shù)據(jù)個(gè)數(shù)不夠,則從左到右對(duì)應(yīng)賦值,沒(méi)有輸入的變量為空;如果輸入的數(shù)據(jù)個(gè)數(shù)超了,則從左到右對(duì)應(yīng)賦值,最后一個(gè)變量被賦予剩余的所有數(shù)據(jù)。2021/5/955 readab foriin`seq$a$b` do echo`expr$i\*10` done 輸出a到b序列數(shù)各數(shù)的10倍數(shù)2021/5/956while例子——求1到100的和i=1sum=0while[$i–le100]do sum=$[$sum+$i]i=$[$i+1]doneecho$sum[]:直接求值命令2021/5/957五命令結(jié)果重定向1 stdout標(biāo)準(zhǔn)輸出2 stderr標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到文件file,終端上只能看到標(biāo)準(zhǔn)錯(cuò)誤:

#命令>file錯(cuò)誤重定向到文件file,終端上只能看到標(biāo)準(zhǔn)輸出:

#命令

2>file標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都重定向到file,終端上看不到任何信息:

#命令

>file2>&1(等于#命令

1>file2>&1)

2021/5/958屏蔽命令任何輸出的:>/dev/null2>&1cp/etc/my.conf>/dev/null2>&1/dev/null 空設(shè)備此句命令的結(jié)果是:cp命令沒(méi)有目標(biāo)文件,應(yīng)該輸出錯(cuò)誤。2>&1表示錯(cuò)誤重定向指向標(biāo)準(zhǔn)輸出。>/dev/null又使標(biāo)準(zhǔn)輸出重定向到空,就是不要輸出信息即:一個(gè)錯(cuò)誤的命令執(zhí)行,什么功能都不實(shí)現(xiàn),且沒(méi)有任何信息或錯(cuò)誤提示輸出。2021/5/9591)command>file2>file2)command>file2>&1有什么區(qū)別?

1)的寫(xiě)法,stdout和stderr都直接送到file中,會(huì)出現(xiàn)兩個(gè)同搶占file的管道,file會(huì)被打開(kāi)兩次,stdout和stderr輸出的信息會(huì)互相覆蓋。

2)的寫(xiě)法將stdout直接送向file,stderr繼承1的管道后,再被送往file,此時(shí),file只被打開(kāi)了一次,也只使用了一個(gè)管道FD1,它包括了stdout和stderr的內(nèi)容。

從IO效率上,前一條命令的效率要比后面一條的命令效率要低,所以在編寫(xiě)shell腳本的時(shí)候,常用command>file2>&1這樣的寫(xiě)法。還可以:命令2>file>&2命令&>/dev/null

2021/5/960*有趣的IORedirection$cat<file>file 文件內(nèi)容會(huì)被洗掉$catfile 此處會(huì)沒(méi)有內(nèi)容stdout、stderr的管道先準(zhǔn)備好才會(huì)從stdin讀內(nèi)容>file會(huì)先清空f(shuō)ile,然後才讀進(jìn)<file,但此時(shí)file已被清空,因此再重定位讀進(jìn)file的為空最后cat顯示的file就成空了

2021/5/961六腳本實(shí)例編寫(xiě)一個(gè)名為iffile程序,它執(zhí)行時(shí)判斷/bin目錄下date文件是否存在?編寫(xiě)一個(gè)名為greet的問(wèn)候程序,它執(zhí)行時(shí)能根據(jù)系統(tǒng)當(dāng)前的時(shí)間向用戶(hù)輸出問(wèn)候信息。設(shè)從半夜到中午為早晨,中午到下午六點(diǎn)為下午,下午六點(diǎn)到半夜為晚上。編寫(xiě)一個(gè)名為ifuser的程序,它執(zhí)行時(shí)帶用戶(hù)名作為命令行參數(shù),判斷該用戶(hù)是否已經(jīng)在系統(tǒng)中登錄,并給出相關(guān)信息。編寫(xiě)一個(gè)名為menu的程序,實(shí)現(xiàn)簡(jiǎn)單的彈出式菜單功能,用戶(hù)能根據(jù)顯示的菜單項(xiàng)從鍵盤(pán)選擇執(zhí)行對(duì)應(yīng)的命令。編寫(xiě)一個(gè)名為chname的程序,將當(dāng)前目錄下所有的.txt文件更名為.doc文件。編寫(xiě)一個(gè)名為chuser的程序,執(zhí)行中每隔5分鐘檢查指定的用戶(hù)是否登錄系統(tǒng),用戶(hù)名從命令行輸入;如果指定的用戶(hù)已經(jīng)登錄,則顯示相關(guān)信息。

2021/5/962

#!/bin/sh-

fname=/bin/date

if(test–f“$fname”)then

echo“exist”

fi

說(shuō)明:

在shell程序中經(jīng)常需要判斷所處理的文件是否存在。本程序采用if語(yǔ)句的簡(jiǎn)單格式測(cè)試date文件,如果存在,則顯示相關(guān)信息,否則退出if語(yǔ)句。①判斷/bin目錄下date文件是否存在2021/5/963

#!/bin/sh-

hour=`date|cut–c10-11`

iftest“$hour”

–ge0–a“$hour”

–le11;then

echo“Goodmorning!”

eliftest“$hour”

–ge12–a“$hour”

–le17;then

echo“Goodafternoon!”

else

echo“Goodevening!”

fi

說(shuō)明:

第一個(gè)有效語(yǔ)句是將命令執(zhí)行的結(jié)果賦給hour變量,所以用反向單引號(hào)。

用cut命令從date命令的輸出中切割出“小時(shí)”信息;這里-c10-11選項(xiàng)表示只切割10到11列。

這個(gè)程序使用了if連用格式,也可以使用if完整格式的嵌套形式。②根據(jù)系統(tǒng)當(dāng)前的時(shí)間向用戶(hù)輸出問(wèn)候信息2021/5/964#!/bin/sh-

iftest$#-ne1then

echo"Incorrectnumberofarguments"

echo"Usage:ifuserusername"

else

user=$1

ifwho|grep–q$user;then

echo$1"userisloggedon."

exit0

else

echo$1"userisnotloggedon."

exit1

fi

fi③判斷用戶(hù)是否已經(jīng)在系統(tǒng)中登錄2021/5/965說(shuō)明:

(1)由于who|grep$user不是表達(dá)式而是命令組合,所以不需要test語(yǔ)句測(cè)試;如果命令組合執(zhí)行成功,即找到指定的用戶(hù)名則返回碼為0;否則為非0。

(2)在這個(gè)程序中使用了grep字符串搜索命令和“|”管道命令

(3)用grep命令–q選項(xiàng)來(lái)禁止顯示搜索到的信息。

(4)還使用了exit命令,以終止shell程序的執(zhí)行。exit0表示程序終止后返回0值,而exit1表示程序終止后返回非0的值。2021/5/966④簡(jiǎn)單的菜單功能#!/bin/sh-

clear

echo" MENU"

echo

echo" 1.Findfilesmodifiedinlast24hours"

echo" 2.Thefreediskspace"

echo" 3.Spaceconsumedbythisuser"

echo" 4.Exit"

echo

echo-n" Select:"

readchoice

case$choicein

1)find$HOME-mtime-1-print;;

2)df;;

3)du-s$HOME;;

4)exit;;

*)echo"Invalidoption"

esac2021/5/967說(shuō)明:

(1)本程序菜單的第一項(xiàng)是顯示/home目錄下,最近24小時(shí)內(nèi)所有修改過(guò)的文件。命令中的-1參數(shù)是數(shù)字“1”,表示一天(24小時(shí))。第二項(xiàng)是檢查磁盤(pán)空間。第三項(xiàng)是顯示/home目錄下文件的大小,命令中的-s選項(xiàng)是為了僅顯示總計(jì)。第四項(xiàng)是退出程序。

(2)為了使程序美觀,用echo–n實(shí)現(xiàn)輸入的選擇數(shù)字不換行。

(3)輸入的數(shù)字不在1-4范圍內(nèi)時(shí),顯示無(wú)效的選項(xiàng)信息。2021/5/968#!/bin/sh-

forfilein*.txt

do

leftname=`basename$file.txt`

mv$file$leftname.doc

done說(shuō)明:

(1)在Linux系統(tǒng)中不支持mv*.txt*.doc這樣的更名命令形式,如果需要將文件成批地更名最好編寫(xiě)一個(gè)shell腳本文件。

(2)在for語(yǔ)句的參數(shù)列表中使用了“*”通配符。

(3(在程序中用到basename命令,該命令從隨后的文件名剝?nèi)ブ付ǖ暮缶Y。⑤將當(dāng)前目錄下所有的.txt文件更名2021/5/969

#!/bin/sh–

iftest$#-ne1

then

echo“Usage:chuserusername”

else

user=”$1”

untilwho|grep“$user”>/dev/null

do

sleep300

done

echo“$userhasloggedon!”

fi說(shuō)明:

(1)如果沒(méi)有從命令行輸入用戶(hù)名,則測(cè)試$#-ne1為“真”,顯示用法提示信息。

(2)程序中until語(yǔ)句的expression(循環(huán)條件)是who|grep“$user”命令執(zhí)行的返回碼,如果沒(méi)有找到指定的用戶(hù)名,返回碼為非0(為“假”),則用sleep命令暫停執(zhí)行程序5分鐘;找到后返回碼為0(為“真”),則終止循環(huán)并顯示該用戶(hù)已經(jīng)登錄的信息。

(3)采用重定向到/dev/null空文件的目的是不顯示查找到的用戶(hù)其他信息。⑥每隔5分鐘檢查指定的用戶(hù)是否登錄系統(tǒng)2021/5/970實(shí)驗(yàn)8.1關(guān)鍵代碼提示1)checkusera=`cut-d:-f1/etc/passwd|grep-c“^$1$”`if[$a-gt0]2)printnumber判斷參數(shù)是否是數(shù) a=$(echo$1|bc2>/dev/dull)if[[$a!=$1]]

$1參數(shù)不是數(shù)bc計(jì)算器,進(jìn)制轉(zhuǎn)換命令可自學(xué):4個(gè)linux篩選數(shù)據(jù)常用工具cut,grep,awk,sed

2021/5/971截取小數(shù)點(diǎn)前后的子串${變量名匹配模式}

截掉匹配子串后剩余字符串是結(jié)果str1=${a%%.*}str2=${a##*.}#從左向右,%從右向左搜索最長(zhǎng)匹配符號(hào)寫(xiě)兩次,最短匹配寫(xiě)1次$

MYVAR=foodforthought.jpg

$

echo

${MYVAR##*fo}

rthought.jpg

$

echo

${MYVAR#*fo}

odforthought.jpg$

MYFOO="chickensoup.tar.gz"

$

echo

${MYFOO%%.*}

chickensoup

$

echo

${MYFOO%.*}

chickensoup.tar指定字符偏移和長(zhǎng)度截出子串$

EXCLAIM=cowabunga$

echo

${EXCLAIM:0:3}

cow#從第一個(gè)字符開(kāi)始,截3個(gè)字符$

echo

${EXCLAIM:3:7}abunga#從第四個(gè)字符開(kāi)始,截7個(gè)字符

2021/5/972作業(yè)練習(xí)本課件給出的例子。熟練vi編輯器,熟悉腳本語(yǔ)法。實(shí)驗(yàn)8.12021/5/973更多練習(xí)練習(xí)vi編輯器的使用并

溫馨提示

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