shell函數(shù)“黃岡賽”一等獎_第1頁
shell函數(shù)“黃岡賽”一等獎_第2頁
shell函數(shù)“黃岡賽”一等獎_第3頁
shell函數(shù)“黃岡賽”一等獎_第4頁
shell函數(shù)“黃岡賽”一等獎_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

shell函數(shù)shell函數(shù)任務(wù)01Shell函數(shù)任務(wù)02Shell案例2學習目標認識shell函數(shù)掌握函數(shù)的定義及調(diào)用。31.Shell函數(shù)

做為一個經(jīng)常寫腳本的運維人員來講,都能發(fā)現(xiàn)一個問題,很多時候我們在不同的腳本里面重復(fù)的寫著同一段代碼。比如我們要去使用正則表達式去判斷IP地址的合法性問題,如果每次都去寫一遍這個匹配IP的表達式,整個表達式寫下來老長老長的,0-9的數(shù)字組合看的眼都花了,是不是很累了。當然有人會說了,保存一份正確的代碼之后,需要用這段代碼的時候,直接粘貼到正在編寫的腳本里面不就行了嘛!是沒錯,但這樣是不是很多腳本里面都重復(fù)存放著同一段代碼,額外增加了腳本的代碼量。有沒有一個兩全其美的辦法,讓我們的腳本代碼量又小,又省去了每次重復(fù)的粘貼同一段代碼的操作,同時還能完美的調(diào)用這段代碼了。shell函數(shù)的出現(xiàn)為我們完美的解決了這一設(shè)想。Shell函數(shù)5函數(shù)介紹函數(shù)(function)是由若干條shell命令組成的語句塊,實現(xiàn)代碼重用和模塊化編程它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分函數(shù)和shell程序的區(qū)別:

Shell程序在子Shell中運行

而Shell函數(shù)在當前Shell中運行。因此在當前Shell中,函數(shù)可以對shell中變量進行修改Shell函數(shù)6定義函數(shù)的語法格式:

函數(shù)由兩部分組成:函數(shù)名和函數(shù)體

語法一:

語法二:

語法三:functionf_name{...函數(shù)體...}functionf_name(){...函數(shù)體...}f_name(){...函數(shù)體...}Shell函數(shù)7函數(shù)的定義方式:

1,可在交互式環(huán)境下直接定義函數(shù),當前shell環(huán)境可調(diào)用

2,可將函數(shù)定義在腳本文件中作為它的一部分,只可自己調(diào)用

3,可寫成單獨的函數(shù)庫文件中,任何腳本都可以調(diào)用函數(shù)的撤銷方式:unset函數(shù)名Shell函數(shù)8函數(shù)的調(diào)用方式:

1,調(diào)用函數(shù)庫中的函數(shù)時,首先得用source或.載入函數(shù)庫文件,再指定要調(diào)用的函數(shù)名

注意:<點><空格><函數(shù)庫文件名>文件名要帶正確路徑

2,命令行定義的、腳本自身定義的,直接指定要調(diào)用的函數(shù)名即可

函數(shù)名出現(xiàn)的地方,會被自動替換為函數(shù)代碼

函數(shù)的生命周期:被調(diào)用時創(chuàng)建,返回時終止Shell函數(shù)9修改已定義的函數(shù):

1,使用set命令查看所有定義的函數(shù),其輸出列表包括已經(jīng)載入shell的所有函數(shù)

2,用unset命令從shell中刪除函數(shù);改動完畢后,再重新載入此函數(shù)或函數(shù)庫文件函數(shù)返回值函數(shù)有兩種返回值:

1,函數(shù)的執(zhí)行結(jié)果返回值:

(1)使用echo或printf命令進行輸出

(2)函數(shù)體中調(diào)用命令的輸出結(jié)果Shell函數(shù)10函數(shù)的退出狀態(tài)碼:

(1)return:默認取決于函數(shù)中執(zhí)行的最后一條命令的退出狀態(tài)碼

(2)return#:自定義退出狀態(tài)碼,其格式為:

return0無錯誤返回

return1-255有錯誤返回Shell函數(shù)11Shell中函數(shù)的定義

LinuxShell可以用戶定義函數(shù),然后在Shell腳本中可以隨便調(diào)用。1)可以帶functionfun()定義,也可以直接fun()定義,不帶任何參數(shù)。2)參數(shù)返回,可以顯示加:return返回,如果不加,將以最后一條命令運行結(jié)果,作為返回值。return后跟數(shù)值n(0-255),Shell函數(shù)返回值只能是整數(shù),一般用來表示函數(shù)執(zhí)行成功與否,0表示成功,其他值表示失敗。如果return其他數(shù)據(jù),比如一個字符串,往往會得到錯誤提示:“numericargumentrequired”。[function]funname[()]{action;[returnint;]}函數(shù)是存在內(nèi)存里的一組代碼的命名的元素。函數(shù)創(chuàng)建于腳本運行環(huán)境之中,并且可以執(zhí)行。函數(shù)的語法結(jié)構(gòu)為:function{}創(chuàng)建函數(shù)不需要do或done這些關(guān)鍵字,只需要大括號來界定函數(shù)的作用范圍。Shell函數(shù)12定義了一個函數(shù)并進行調(diào)用:

Shell實例:function.shShell函數(shù)13下面定義一個帶有return語句的函數(shù):Shell實例:function_return.sh#!/bin/bashfunWithReturn(){echo"這個函數(shù)會對輸入的兩個數(shù)字進行相加運算..."echo"輸入第一個數(shù)字:"readaNumecho"輸入第二個數(shù)字:"readanotherNumecho"兩個數(shù)字分別為$aNum和$anotherNum!"return$(($aNum+$anotherNum))}funWithReturnecho"輸入的兩個數(shù)字之和為$?!"Shell函數(shù)14執(zhí)行腳本輸出:輸入第一個數(shù)字:1輸入第二個數(shù)字:2兩個數(shù)字分別為1和2!輸入的兩個數(shù)字之和為3!

函數(shù)返回值在調(diào)用該函數(shù)后通過$?來獲得。所有函數(shù)在使用前必須定義。這意味著必須將函數(shù)放在腳本開始部分,直至Shell解釋器首次發(fā)現(xiàn)它時,才可以使用。調(diào)用函數(shù)僅使用其函數(shù)名即可。

注意:Shell函數(shù)15

在Shell中,調(diào)用函數(shù)時可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過$n的形式來獲取參數(shù)的值,例如,$1表示第一個參數(shù),$2表示第二個參數(shù)...帶參數(shù)的函數(shù)示例:Shell實例:function_param.sh#!/bin/bashfunWithParam(){echo"第一個參數(shù)為$1!"echo"第二個參數(shù)為$2!"echo"第十個參數(shù)為$10!"echo"第十個參數(shù)為${10}!"echo"第十一個參數(shù)為${11}!"echo"參數(shù)總數(shù)有$#個!"echo"作為一個字符串輸出所有參數(shù)$*!"}funWithParam1234567893473Shell函數(shù)16輸出結(jié)果:第一個參數(shù)為1!第二個參數(shù)為2!第十個參數(shù)為10!第十個參數(shù)為34!第十一個參數(shù)為73!參數(shù)總數(shù)有11個!作為一個字符串輸出所有參數(shù)1234567893473!$10不能獲取第十個參數(shù),獲取第十個參數(shù)需要${10}。當n>=10時,需要使用${n}來獲取參數(shù)。注意:Shell函數(shù)17

特殊字符處理參數(shù):參數(shù)處理說明$#傳遞到腳本的參數(shù)個數(shù)$*以一個單字符串顯示所有向腳本傳遞的參數(shù)$$腳本運行的當前進程ID號$!后臺運行的最后一個進程的ID號$@與$*相同,但是使用時加引號,并在引號中返回每個參數(shù)。$-顯示Shell使用的當前選項,與set命令功能相同。$?顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其他任何值表明有錯誤。Shell函數(shù)182.Shell案例下面我們用自己編寫個文件的行計數(shù)的腳本:我們先實現(xiàn)指定文件作為參數(shù)的的文件行數(shù)計數(shù)腳本,代碼如下,#!/bin/bash#Simplelinecountexample,usingbash##LinuxsShell綜合實訓#Author:CETC55#Since:v1.0#Date:2017/03/23#Usage:./get_dir_file_linecount1.sh#-----------------------------#getfilelinecountbywccommandShell案例20count_lines(){localf=$1#thisisthereturnvalue,i.e.nonlocall=`wc-l$f|sed's/^\([0-9]*\).*$/\1/'`}if[$#-lt1]thenecho"Usage:$0file..."exit1fiecho"$0countsthelinesofcode"l=0n=0s=0while["$*"!=""]docount_lines$1echo"$1:$l"n=$[$n+1]s=$[$s+$l] shiftdoneecho"$nfilesintotal,with$slinesintotal"Shell案例21

其中計算行數(shù)封裝了一個函數(shù),改shell還要處理輸入的參數(shù)。下面執(zhí)行該腳本,執(zhí)行結(jié)果如下:改變權(quán)限并運行:[root@controllershell_scripts]#chmoda+xget_dir_file_linecount1.sh[root@controllershell_scripts]#./get_dir_file_linecount1.shtetris.sh./get_dir_file_linecount1.shcountsthelinesofcodetetris.sh:12371filesintotal,with1237linesintotal[roo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論