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

文檔簡(jiǎn)介

1、,College of Information Science and Engineering,Shandong Agricultural University,SHELL腳本編程,2,shell腳本能提高用戶操作和管理員進(jìn)行系統(tǒng)管理的效率,一般步驟 編輯器編寫腳本程序 shell做解釋程序,非交互地執(zhí)行腳本,兩種執(zhí)行方式: 用sh命令執(zhí)行腳本文件 給腳本文件添加執(zhí)行權(quán)限,用./命令執(zhí)行,3,HELLO WORLD!,vi hello.sh 按i進(jìn)入插入模式 輸入echo “hello world!” :輸入wq保存退出 sh hello.sh 或者 chmod 755 hello.sh ./

2、hello.sh,4,一、VI編輯器,VI的三種工作模式 VI的啟動(dòng) VI的退出 VI的文本編輯 VI命令模式下的操作 VI行命令模式下的操作,5,系統(tǒng)配置文件、shell腳本文件等都是文本文件,編輯它們都要使用文本編輯器。 在Linux系統(tǒng)中有多種文本編輯器,其中既有字符界面如的VI、EMACAS等,也有圖形界面的如“附件”菜單下的“文本編輯器(gedit)”等,用戶可以根據(jù)自己的喜好選擇使用。 學(xué)習(xí)vi的方法:vi的命令太多且難以記憶,而實(shí)際上真正經(jīng)常使用的命令并不是太多,只要掌握幾個(gè)關(guān)鍵的并加以適當(dāng)練習(xí)很快就上手使用vi。,6,為什么選擇VI,就使用的方便性而言,有比vi更好的編輯器,還

3、要圖形化的edit,為什么還要用vi? 歷史久遠(yuǎn),功能強(qiáng)大,在有些情況下系統(tǒng)中能夠找到的編輯器只有vi; 用戶一旦熟悉后,使用非常方便;系統(tǒng)管理員使用正則表達(dá)式可以極大地提高工作效率,而學(xué)習(xí)vi也是掌握正則表達(dá)式的有效途徑。 由于vi的版本不同,其命令格式、功能和用法會(huì)有一些差別。Shell中執(zhí)行vi命令,RedHat系統(tǒng)實(shí)際上是執(zhí)行vim,它是傳統(tǒng)vi的增強(qiáng)版本,7,1、VI的三種工作模式,命令模式 啟動(dòng)VI默認(rèn)進(jìn)入命令模式。此時(shí)界面不能編輯,只能接受命令(鍵入的命令看不到) 文件的保存,退出,文本的刪除、復(fù)制、搜索等操作 輸入模式 編輯模式 命令模式下用i(sert),a(ppend),o

4、,s等均可進(jìn)入該模式。按esc返回命令模式 行編輯模式 實(shí)際上也是命令模式的一種,在命令模式下輸入冒號(hào)進(jìn)入一個(gè)命令行,可顯示地輸入命令(所以也有些書認(rèn)為是兩種工作模式)。 三種模式可自由切換,一般切換命令就是操作的英文單詞的首字母,8,2、VI的啟動(dòng),啟動(dòng)命令:vi my.txt 如果文件存在,則vi顯示文件內(nèi)容并等待用戶的命令。 如果指定的文件不存在,則vi將告知用戶這是未命名的文件,并進(jìn)入一個(gè)空白的界面。 啟動(dòng)vi時(shí)都是默認(rèn)處于命令模式。用戶必須使用命令切換到文本輸入模式才能進(jìn)行輸入編輯,或者可執(zhí)行刪除、復(fù)制等編輯命令。,vi R file_name,以只讀方式打開(kāi)文件,9,3、VI的退出

5、,冒號(hào)進(jìn)命令行模式下: :q! 不存檔強(qiáng)制退出。 :w 保存但不退出,w(rite)后可加所要存檔的文檔名。 :wq 存檔后退出。 命令模式下按zz,功能與 :wq 相同。 :x 與:wq相同 命令模式: ZZ、ZQ保存/不保存退出,10,4、怎么編輯,必須從命令模式轉(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)入輸入模式

6、。O: 在光標(biāo)所在行上方新增一列并進(jìn)入輸入模式。,冒號(hào)進(jìn)入行命令模式,輸入set nu可設(shè)置vi顯示行號(hào),11,5、命令模式下的操作:刪除與修改,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)

7、前行),u:恢復(fù)剛才被修改的文本 U:恢復(fù)光標(biāo)所在行的所有修改 .:重復(fù)上一次命令的操作,12,命令模式下的操作:文本復(fù)制、粘貼,復(fù)制命令:y yy: 復(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、l nG:移動(dòng)到底n行行首,13,6、行命令模式下的操作:字符串的查找、替換,:/string搜索指定的字符串。 按鍵n:繼續(xù)進(jìn)行搜索 如果寫的是斜杠(/):按n會(huì)從當(dāng)前位置向后查找;如果寫的是問(wèn)號(hào)(?),按n鍵則從當(dāng)前位置向前查找 查找且替換 :%s /SEARCH /REPLACE 把文檔中所有SEA

8、RCH替換成REPLACE; :#,# s /SEARCH /REPLACE /g 號(hào)表示數(shù)字,表示從多少行到多少行,把SEARCH替換成REPLACE; :s /SEARCH /REPLACE /g 把當(dāng)前光標(biāo)所在行中的SEARCH單詞,替換成REPLACE,并把所有SEARCH高亮顯示,14,7、設(shè)置vi,全局的配置文件位于/etc/vim/vimrc(或者/etc/vimrc) 也可以擁有自己獨(dú)立的配置文件,配置文件位“/.vimrc”,如果沒(méi)有該文件,也可以直接用如下命令創(chuàng)建并編輯 比如: set nu 顯示行號(hào) set ruler 顯示光標(biāo)位置 set undolevel 顯示光標(biāo)位

9、置 set smartindent 智能縮進(jìn) syntax on(或syn on) 語(yǔ)法高亮,15,三種模式間的轉(zhuǎn)換關(guān)系,16,案例練習(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),我要將

10、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),17,1. mkdir /tmp/vitest 2. cd /tmp/vitest 3. cp /etc/man.config . 4. vi man.config 5. :set

11、 nu 6. 先按下 58G 再按下 40 會(huì)看到 /dir/bin/foo 這個(gè)字樣在雙引號(hào)內(nèi); 7. 先執(zhí)行 1G 或 gg 后,直接輸入 /bzip2 8. 直接執(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. :w man.test.config 13. 29G 之后,再給他 15x 即可刪除 15 個(gè)字符; 14. :wq!,

12、18,二、SHELL變量與語(yǔ)法,Shell概述 shell變量和符號(hào) shell控制流程語(yǔ)法 shell中的輸出重定向 腳本實(shí)例,19,1、shell的基本元素 (1) #!/bin/bash 必須的,指出shell的類型 (2)# 注釋 (3)變量 (4)控制,一、Shell概述,一個(gè)shell腳本 vi clearup.sh #!/bin/bash # this is clear cd /var/log cat /dev/null/var/log/messages /dev/null Linux中的無(wú)限大的垃圾回收站 echo Logs cleaned up.,20,2、一般步驟: (1)

13、編輯文件 (2)保存文件 (3)將文件賦予可執(zhí)行的權(quán)限 (4)運(yùn)行及排錯(cuò),21,注意: 一般以.sh為文件后綴。沒(méi)有也能執(zhí)行。 常見(jiàn)的兩種執(zhí)行方式 ./文件名在當(dāng)前目錄下寫明路徑執(zhí)行,要求文件必須有執(zhí)行權(quán)限,如 chmod 755 run.sh ./run.sh sh 文件名 sh run.sh 文件開(kāi)頭指定一個(gè)或多個(gè)解釋腳本程序的shell,如#!/bin/bash 如果指定,注意/bin不要漏了“/”,否則用./方式執(zhí)行會(huì)找不到路徑。 不指定的話一般默認(rèn)以/bin/sh執(zhí)行shell腳本,22,3、Shell的一般結(jié)構(gòu) shell 類型 函數(shù) 主過(guò)程 一般模板 abc.sh #!/bin/

14、bash shell類型 #a simple shell script example #a function funciton sayhello() 函數(shù) echo Enter Your name: read name 讀取來(lái)自鍵盤輸入的變量 echo Hello $name echo programme starts here. 主過(guò)程 sayhello echo programme ends.,23,1、注釋符# 除了#!/bin/bash里的#特殊 2、美元符 $ 變量符。與反斜杠轉(zhuǎn)義符相反,使其后的普通字符作為變量名,如$a表示變量a的值。變量字符長(zhǎng)度超過(guò)1個(gè)時(shí),用括起來(lái) 3、單引號(hào)

15、 被引起的字符全部做普通字符,即全部原樣 echo my $SHELL,二、Shell中的特殊符號(hào),24,4、雙引號(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)變量,25,練習(xí)一下:區(qū)別下面幾句,echo my home is $HOME echo “my home is $HOME” echo my home is $HOME echo “my home is pwd” echo my h

16、ome is pwd,用于括起來(lái)shell命令 用于原樣顯示,26,6. 反斜線 反斜線是轉(zhuǎn)義字符,它能把特殊字符變成普通字符。在某個(gè)字符前面利用反斜杠()能夠阻止shell把后面的字符解釋為特殊字符。 例4: yuqunyuqun $echo “Filename is N0$*” Filename is N0$* 注意:在單引號(hào)括起來(lái)的字符串中,反斜線也成為普通字符,而失去轉(zhuǎn)義字符功能。,27,三、變量,shell 變量 可以保存如路徑名、文件名或者一個(gè)數(shù)字 本地變量 局部變量只在創(chuàng)建它們的Shell中使用,可以在shell程序內(nèi)任意使用和修改它們。 環(huán)境變量 可以在創(chuàng)建它們的Shell及其

17、派生出來(lái)的任意子程序中使用。有些變量是用戶創(chuàng)建的,其他的則是專用的(比如PATH、HOME)。是系統(tǒng)環(huán)境的一部分,不必去定義它們,可以在shell程序中使用它們 。還能在shell中加以修改。 內(nèi)部變量 由系統(tǒng)提供的。與環(huán)境變量不同,但用戶不能修改它們。,28,本地變量和環(huán)境變量的對(duì)比,29,1、本地變量(局部變量、用戶變量),本地變量 在用戶現(xiàn)在的shell生命期的腳本中使用 變量名=值 注意: (1)等號(hào)兩邊不可以有空格 (2)取值包含空格,必須用雙引號(hào)括起來(lái) (3)Shell變量可以用大小寫字母,區(qū)分大小寫,30,變量的聲明和使用 (1)變量是弱類型的(不用聲明類型) (2)變量聲明及賦

18、值格式 變量=值(等號(hào)兩邊不能有空格) (3)變量的引用 $變量名 $變量名 變量名為1個(gè)字符時(shí)建議使用方式一,多余一個(gè)字符時(shí)建議使用方式二 舉例: $a $abc,31,顯示變量 echo命令可以顯示單個(gè)變量取值,變量名前加$,echo $Name echo $name echo $nameare echo $name are,輸出引用變量時(shí)加比較好,32,清除變量 unset 變量名 舉例:echo $name unset name (注意:name前沒(méi)有$) 顯示本地所有變量 set,33,設(shè)置只讀變量,設(shè)置變量時(shí),不想再改變其值,可以將之設(shè)為只讀變量 變量名=值 readonly 變量

19、名,34,2、環(huán)境變量,環(huán)境變量用于所有用戶進(jìn)程(通常稱為子進(jìn)程)。登陸進(jìn)程稱為父進(jìn)程,通過(guò)pstree可以查看 環(huán)境變量可以用于所有子程序,著包括編輯器、腳本和應(yīng)用 舉例:vi a.sh #!/bin/bash # 檢測(cè)環(huán)境變量 echo 家目錄是 $HOME 環(huán)境變量可以在命令行中設(shè)置,但用戶注銷時(shí)這些值將丟失 環(huán)境變量均為大寫 必須用export命令導(dǎo)出,35,設(shè)置環(huán)境變量 variable-name=value export variable-name(環(huán)境變量名大寫) 顯示環(huán)境變量 env 可以看到所有的環(huán)境變量 echo $環(huán)境變量名 (顯示一個(gè)變量) 清除環(huán)境變量 unset 環(huán)

20、境變量名,36,HOME : 代表使用者的家目錄。cd 去到使用者的家目錄 或者利用 cd 就可以直接回到使用者家目錄了。 PS1:shell的主提示符 SHELL : 目前這個(gè)環(huán)境使用的 SHELL 是哪個(gè)程序? 如果是 bash 的話,預(yù)設(shè)是 /bin/bash PWD:用戶當(dāng)前工作目錄的路徑。它指出用戶目前在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 這

21、個(gè)指令在收信時(shí),系統(tǒng)會(huì)去讀取的郵件信箱文件 (mailbox)。 PATH : 就是執(zhí)行文件搜尋的路徑,目錄與目錄中間以冒號(hào)(:)分隔, 由于文件的搜尋是依序由 PATH 的變量?jī)?nèi)的目錄來(lái)查詢,所以,目錄的順序也是重要的喔。 LANG : 語(yǔ)系文件,很多數(shù)據(jù)都會(huì)用到他,當(dāng)出現(xiàn)編碼錯(cuò)誤的時(shí)候往往需要設(shè)置它,中文編碼是zh_CN.UTF8,37,PATH示例,舉例:配置java環(huán)境變量可使任何目錄都能執(zhí)行javac命令 (1)需要配置Java環(huán)境變量 JAVA_HOME(JDK存放的路徑) CLASSPATH(字節(jié)碼的位置,讓JVM知道要運(yùn)行的類的字節(jié)碼放在哪) PATH (讓OS找到j(luò)avac等

22、命令的存放的位置) (2)在Linux下配置它們 打開(kāi)終端 vi .bash_profile 在配置文件中追加內(nèi)容 JAVA_HOME=JDK存放位置 CLASSPATH=.(當(dāng)前目錄) PATH=$JAVA_HOME/BIN:$PATH(不覆蓋原來(lái)的內(nèi)容,追加) export JAVA_HOME CLASSPATH PATH 保存,讓配置起作用(source .bash_profile或者注銷),38,讓環(huán)境變量的修改在退出shell再次登錄時(shí)仍有效,需要在相關(guān)配置文件中修改 Bash的初始化文件有:/etc/profile、/.bash_profile、/.bash_login、/.pro

23、file、/.bashrc、/etc/bashrc,/etc/profile,/.bash_profile,/.bashrc,/etc/bashrc,/.bash_login,/.profile,39,/etc/profile 存放一些全局(共有)變量,不管哪個(gè)用戶,登錄時(shí)都會(huì)讀取該文件。通常設(shè)置一些Shell變量PATH,USER,HOSTNAME和HISTSIZE等 /.bash_profile:每個(gè)用戶都可使用該文件輸入專用于自己使用的shell信息,當(dāng)用戶登錄時(shí),該文件僅僅執(zhí)行一次!默認(rèn)情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶的.bashrc文件. /.bashrc:該文件包含專用于你的b

24、ash shell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開(kāi)新的shell時(shí),該該文件被讀取. /etc/bashrc:為每一個(gè)運(yùn)行bash shell的用戶執(zhí)行此文件.當(dāng)bash shell被打開(kāi)時(shí),該文件被讀取.,40,上述配置文件的作用 1)登錄Linux先啟動(dòng)系統(tǒng)配置文件/etc/profile,并從/etc/profile.d目錄的配置文件中搜集shell的設(shè)置,為系統(tǒng)的每個(gè)用戶設(shè)置環(huán)境信息。 2)用戶配置文件/.bash_profile,每個(gè)用戶專用于自己使用的shell信息,僅用戶登錄時(shí)執(zhí)行一次! 默認(rèn)情況下,此文件通過(guò)腳本執(zhí)行同目錄下用戶的.bashrc文件。 3)/.bashrc文

25、件包含專用于用戶bash shell的bash信息,登錄及每次打開(kāi)新的shell時(shí)都會(huì)執(zhí)行。里面又會(huì)調(diào)用/etc/bashrc,41,設(shè)置用戶自己的環(huán)境變量,在/home/user/.bash_profile中定義下句,會(huì)怎樣? alias la=ls a|grep “.*” 答:user下次再登陸,其shell會(huì)自動(dòng)建立一個(gè)別名命令la,功能為查看當(dāng)前目錄下名字以.開(kāi)頭的文件。 寫在/.bash_profile中,需重新登錄才能有效。除非運(yùn)行source .bash_profile使其立即有效。 寫在/.bashrc中,則打開(kāi)新的終端中就有效 區(qū)別:bash_profile只在會(huì)話開(kāi)始的時(shí)候

26、讀取一次,而bashrc則每次打開(kāi)終端時(shí)都會(huì)讀取 按照傳統(tǒng),定義的變量如PATH放到.bash_profile中,而像別名函數(shù)等放在.bashrc中,但是.bash_profile先于.bashrc讀取內(nèi)容,也可全放入.bashrc中,習(xí)慣用各自的配置文件,編輯不需要root權(quán)限,42,3、內(nèi)部變量 內(nèi)部變量是Linux所提供的一種特殊類型的變量,這類變量在程序中用來(lái)作出判斷。在shell程序內(nèi)這類變量的值是不能修改的。 部分內(nèi)部變量是: $# 傳送給shell程序的位置參數(shù)的數(shù)量 $?最后命令的完成碼或者在shell程序內(nèi)部執(zhí)行的shell程序(返回值) $0shell程序的名稱 $*調(diào)用s

27、hell程序時(shí)所傳送的全部參數(shù)的單字符串, “參數(shù)1”“參數(shù)2”形式保存的參數(shù),43,$“參數(shù)1”“參數(shù)2”形式保存的參數(shù) $n第n個(gè)參數(shù) $本程序的PID $!上一個(gè)命令的PID,44,使用shell預(yù)定義變量的腳本舉例,45,4 位置參數(shù)(1) 位置參數(shù)及引用 可以編寫一個(gè)shell腳本,當(dāng)從命令行或者從其他shell腳本中調(diào)用它的時(shí)候,這個(gè)腳本接收若干參數(shù)。這些選項(xiàng)是通過(guò)Linux作為位置參數(shù)(positional parameter)提供給shell程序的。在shell腳本中應(yīng)有變量,接收實(shí)參,這類變量的名稱很特別,分別是1,2,3,這類變量稱為位置變量。位置參數(shù)1存放在位置變量1中,

28、位置參數(shù)2存放位置變量2中,在程序中可以使用$1,$2,來(lái)訪問(wèn), 舉例:,46,(2) 用set命令為位置參數(shù)賦值 在shell程序中可以利用set命令為位置參數(shù)賦值或重新賦值。 一般格式: set 參數(shù)表 說(shuō)明:該命令后面無(wú)參數(shù)時(shí),將顯示系統(tǒng)中的系統(tǒng)變量的值;如果有參數(shù)將分別給位置參數(shù)賦值。,47,四、變量表達(dá)式,1、條件判斷命令test test n1 -參數(shù) n2(或 參數(shù) 表達(dá)式) 真返回0,假返回1。 (1)整數(shù),比較運(yùn)算符見(jiàn)右表 test 1 lt 4 #判斷14 echo $? #結(jié)果為0 test語(yǔ)句的等價(jià)形式 1 lt 4 可用中括號(hào)代替test,把表達(dá)式括起來(lái)實(shí)現(xiàn)判斷 注意

29、表達(dá)式與中括號(hào)間有空格。,-lt小于 -le小于等于 -gt大于 -ge大于等于 -eq等于 -ne不等于,48,eg1:若輸入的參數(shù)x 是正數(shù),顯示 x number is positive,49,(2)文件測(cè)試,-f存在且是普通文件 -d存在且是目錄 -s存在且字節(jié)數(shù)大于0 -r存在且可讀 -w存在且可寫 -x存在且可執(zhí)行 如:test -d “mydoc” 判斷mydoc是否是目錄,eg2:檢測(cè)從命令行輸入的文件是否存在,50,3、字符串測(cè)試 test s 字符串s非空 test s1=s2字符串s1等于s2 test s1!=s2字符串s1不等于s2 test -z s字符串長(zhǎng)=0,即

30、為空串 test -n字符串長(zhǎng)0 4、其他參數(shù) -a邏輯與 -o邏輯或 !邏輯非,51,3、控制流程,shell運(yùn)算符和C語(yǔ)言基本類似,也有分支、循環(huán)流程控制。 簡(jiǎn)單舉例 后面例子涉及的命令 seq命令:產(chǎn)生1-9的數(shù)字序列 比如 seq 1 4 expr命令:對(duì)表達(dá)式求值 直接求值命令:對(duì)被括起來(lái)的表達(dá)式求值,52,表達(dá)式求值: $ expr 1 + 3 $ expr 2 1 $ expr 1 * 3 使用*要加轉(zhuǎn)義符 $ echo expr 1 + 3 注意:表達(dá)式中,數(shù)字和運(yùn)算符指教要有空格,出現(xiàn)在語(yǔ)句中要加反引號(hào),53,1)分支結(jié)構(gòu),if分支 if $# -eq 0 then echo

31、 “輸入了0個(gè)參數(shù)” elif $# -lt 1 then echo “輸入了多個(gè)參數(shù)” else echo “輸入了1個(gè)參數(shù)” fi,case case “$#” in 0) echo “輸入了0個(gè)參數(shù)”; 1) echo “輸入了1個(gè)參數(shù)”; *) echo “輸入了多個(gè)參數(shù)”; esac 每個(gè)分支條件后必須以兩個(gè)分號(hào)結(jié)尾,54,2)循環(huán)結(jié)構(gòu),for 例子輸出100內(nèi)10的倍數(shù) for i in seq 1 9 do echo expr $i * 10 done 或?qū)慹cho $(expr $i * 10),乘號(hào)前加轉(zhuǎn)義符, 與數(shù)字間要有空格。,55,read 變量1 變量2 可以從鍵盤上

32、讀取多個(gè)變量的值,用戶輸入數(shù)據(jù)時(shí),以空格或者Tab鍵作為分隔。 如果輸入的數(shù)據(jù)個(gè)數(shù)不夠,則從左到右對(duì)應(yīng)賦值,沒(méi)有輸入的變量為空; 如果輸入的數(shù)據(jù)個(gè)數(shù)超了,則從左到右對(duì)應(yīng)賦值,最后一個(gè)變量被賦予剩余的所有數(shù)據(jù)。,56,read a b for i in seq $a $b do echo expr $i * 10 done 輸出a到b序列數(shù)各數(shù)的10倍數(shù),57,while例子求1到100的和 i=1 sum=0 while $i le 100 do sum=$sum+$i i=$i+1 done echo $sum, :直接求值命令,58,五 命令結(jié)果重定向,1stdout標(biāo)準(zhǔn)輸出 2stder

33、r標(biāo)準(zhǔn)錯(cuò)誤 輸出重定向到文件file,終端上只能看到標(biāo)準(zhǔn)錯(cuò)誤:#命令 file 錯(cuò)誤重定向到文件file ,終端上只能看到標(biāo)準(zhǔn)輸出:#命令 2file 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都重定向到file,終端上看不到任何信息:#命令 file 2 thenecho “Good morning!”elif test “$hour” ge 12 a “$hour” le 17; thenecho “Good afternoon!”elseecho “Good evening!”fi 說(shuō)明:第一個(gè)有效語(yǔ)句是將命令執(zhí)行的結(jié)果賦給hour變量,所以用反向單引號(hào)。用cut命令從date命令的輸出中切割出“小時(shí)”信息;這

34、里-c 10-11選項(xiàng)表示只切割10到11列。這個(gè)程序使用了if連用格式,也可以使用if完整格式的嵌套形式。,根據(jù)系統(tǒng)當(dāng)前的時(shí)間向用戶輸出問(wèn)候信息,65,#! /bin/sh -if test $# -ne 1 thenecho Incorrect number of arguments echo Usage: ifuser usernameelse user=$1 if who | grep q $user ; then echo $1 user is logged on. exit 0 else echo $1 user is not logged on. exit 1 fifi,判斷用戶

35、是否已經(jīng)在系統(tǒng)中登錄,66,說(shuō)明:(1)由于who | grep $user不是表達(dá)式而是命令組合,所以不需要test語(yǔ)句測(cè)試;如果命令組合執(zhí)行成功,即找到指定的用戶名則返回碼為0;否則為非0。(2)在這個(gè)程序中使用了grep字符串搜索命令和“|”管道命令(3)用grep 命令q選項(xiàng)來(lái)禁止顯示搜索到的信息。 (4)還使用了exit命令,以終止shell程序的執(zhí)行。exit 0表示程序終止后返回0值,而exit 1表示程序終止后返回非0的值。,67,簡(jiǎn)單的菜單功能,#! /bin/sh -clearecho -MENU-echoecho 1.Find files modified in last

36、 24 hoursecho 2.The free disk spaceecho 3.Space consumed by this userecho 4.Exitecho echo -n Select:read choicecase $choice in1)find $HOME -mtime -1 -print;2)df;3)du -s $HOME;4)exit;*)echo Invalid optionesac,68,說(shuō)明:(1)本程序菜單的第一項(xiàng)是顯示/home目錄下,最近24小時(shí)內(nèi)所有修改過(guò)的文件。命令中的-1參數(shù)是數(shù)字“1”,表示一天(24小時(shí))。第二項(xiàng)是檢查磁盤空間。第三項(xiàng)是顯示/ho

37、me目錄下文件的大小,命令中的-s選項(xiàng)是為了僅顯示總計(jì)。第四項(xiàng)是退出程序。(2)為了使程序美觀,用echo n實(shí)現(xiàn)輸入的選擇數(shù)字不換行。(3)輸入的數(shù)字不在1-4范圍內(nèi)時(shí),顯示無(wú)效的選項(xiàng)信息。,69,#! /bin/sh -for file in *.txtdoleftname=basename $file .txtmv $file $leftname.docdone 說(shuō)明:(1)在Linux系統(tǒng)中不支持mv *.txt *.doc這樣的更名命令形式,如果需要將文件成批地更名最好編寫一個(gè)shell腳本文件。(2)在for語(yǔ)句的參數(shù)列表中使用了“*”通配符。(3(在程序中用到basename命令

38、,該命令從隨后的文件名剝?nèi)ブ付ǖ暮缶Y。,將當(dāng)前目錄下所有的.txt文件更名,70,#! /bin/sh if test $# -ne 1thenecho “Usage: chuser username”elseuser=”$1”until who |grep “$user”/dev/nulldosleep 300doneecho “$user has logged on!”fi 說(shuō)明:(1)如果沒(méi)有從命令行輸入用戶名,則測(cè)試$# -ne 1為“真”,顯示用法提示信息。(2)程序中until語(yǔ)句的expression(循環(huán)條件)是who|grep “$user”命令執(zhí)行的返回碼,如果沒(méi)有找到指定的用戶名,返回碼為非0(為“假”),則用sleep命令暫停執(zhí)行程序5分鐘;找到后返回碼為0(為“真”),則終止循環(huán)并顯示該用戶已經(jīng)登錄的信息。(3)采用重定向到/dev/null空文件的目的是不顯示查找到的用戶其他信息。,每隔5分鐘檢查指定的用戶是否登錄系統(tǒng),71,實(shí)驗(yàn)8.1,關(guān)鍵代碼提示 1)checkuser a=cut -d: -f1 /etc/passwd | grep -c “$1$” if $a -gt 0 2)printnumber 判斷參數(shù)是否是數(shù) a=$(echo $1|bc 2/dev/dull) if $a !

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論