bash腳本編程class3—函數定義與數組使用相關
一.函數的使用以及數組的定義
我們通過學習知道,當編輯一個shell腳本的時候,可以在這個shell腳本中調用其他的shell腳本來實現特定的功能。在實際工作環境中,用很多shell實現的功能是我們常常使用到的,如果一次一次的調用這些shell腳本會顯得非常麻煩。這時,函數的作用就體現出來了。其實函數就是一個被定義并命名的常用shell腳本,所有函數都集中放在一個配置文件中,當用戶使用的時候,只需要調用這個文件內容,就可以根據其中每個函數名稱來使用。比如如果我們在/etc/functions這個文件寫入了很多函數,如果想要在一個腳本中使用這些函數,只需要在腳本中調用/etc/functions這個文件,就可以使用這些函數了。
1.函數的定義方式
函數的定義方式有三種:
function 函數名() { ;函數內容 ;}
函數名 () { ;函數內容 ;}
function 函數名 { ;函數內容 ;}
filejudge () { [ ! -e $1 ]&&echo "meiwenjian"&& exit if [[ -f $1 ]] then echo "This is a ordinary file" elif [[ -d $1 ]] then echo "This is a directory" elif [[ -h $1 ]] then echo "This is a link file" else echo "This is an other file type" fi }
上面使用的就是第二種函數命名方式,這個函數體實現的功能為辨別文件的類型。
2.載入函數以及檢驗載入函數
當我們在一個shell文件中編譯好了一系列的函數之后,如何使用這些函數呢?這里需要使用source或者.命令,這樣可以使函數文件的內容立即生效。使用set命令可以查看當前系統中定義的所有函數。如果想取消某些函數的使用,使用unset 函數名,就可以取消這個函數的使用。載入函數以后,直接使用函數名[后加參數],就可以實現函數功能了。
3.函數的返回值以及局部變量
在執行一個命令之后,echo $?可以顯示命令的成功與否。而函數大多是由多條命令組成的,正常情況下,當用戶鑒定函數體是否執行成功時,是根據函數中最后一條命令的成功與否來判斷的。如果想要定義返回值,使用return后接數字來實現。return 0表示成功,return1 1-255表示有錯誤返回值。同樣使用echo命令來顯示。return的好處是可以根據返回狀態值進行條件選擇執行不同分支的命令,從而使函數應用性更強。
在函數中可以定義變量,可以定義本地變量與環境變量。但是如果用戶只想要在函數中使用這個變量,執行函數完成后不想讓這個變量在當前shell中繼續使用,防止與同名變量沖突。這該怎么辦呢?Linux的有一種變量可以達到這個卸磨殺驢的效果,就是局部變量,這個變量只能在函數中定義,只能在函數體中使用,執行完函數體就沒效果了。使用local name=變量名,來定義。比如:
#!/bin/bash name=dafei xxx () { local name=xiaowangba } echo $name
上述我們寫一個函數的腳本,先定義變量name=dafei,然后在函數體內定義局部變量name=xiaowangba,在函數外執行name變量顯示。如果執行這個腳本,你猜name會是什么?
[root@localhost bin]# bash funstest.sh dafei
當然是dafei。
4.函數遞歸以及其使用實例
函數遞歸說白了就是函數自己調用自己,前提是此函數可以使用的情況下。應用這種遞歸方式,可以實現一些規律性的數據計算。比如 Fn = Fn-1 + Fn-2。如果想計算Fn的值,需要如下函數遞歸:
goldrabbit () { if [ $1 -eq 1 ];then echo 0 elif [ $1 -eq 2 -o $1 -eq 3 ];then echo 1 else echo $[$(goldrabbit $[$1-1])+$(goldrabbit $[$1-2])] fi }
goldrabbit為函數名,根據數列規律我們得知:F3=F2+F1=1,F2=F3=1,F1=0。F4=F2+F3=2…這樣就可以得知Fn的值了。
二.數組定義以及字符串處理
1.數組的定義
之前所學的變量每一次賦值都是單個數字或者字符串,如果想要一次賦值多個變量,就需要數組的概念了。使用name=(若干變量…)。定義name為一個數組。
使用數組之前一般需要declare -a name聲明數組。變量分割符為空格,默認從name[0]到name[n-1]。比如:
[root@localhost ~]# baobao=(xx yy zz aa bb) [root@localhost ~]# echo ${baobao[1]} yy
如上這里為變量baobao定義一個數組,顯示baobao[1],結果為數組中的第二個變量yy。
有些時候數組的排序不適用0到n-1,使用a,b,c..也是可以的,但是前面一定要聲明declare -A。比如:
[root@localhost ~]# declare -A baobao [root@localhost ~]# baobao=([a]=aa [b]=bb [c]=cc [d]=dd) [root@localhost ~]# echo ${baobao[b]} bb
這里可以看到數組變量的排序不是0到n-1了,而是a,b,c,d。這就是關聯數組declare -A的作用。
2.數組變量的修改
實現數組內容的增刪查改:只能追增,根據編號順序追增,如果編號順序重復則覆蓋。刪,使用unset name[number]刪除編號的內容。查,echo ${name[*]}顯示所有變量,echo ${#name[*]}顯示數組中變量個數。上例子:
[root@localhost ~]# declare -a baobao [root@localhost ~]# baobao=(aa bb cc dd ee) [root@localhost ~]# echo ${#baobao[*]} 5 [root@localhost ~]# echo ${baobao[*]} aa bb cc dd ee [root@localhost ~]# baobao[6]=xx [root@localhost ~]# echo ${baobao[*]} aa bb cc dd ee xx [root@localhost ~]# unset baobao[0] [root@localhost ~]# echo ${baobao[*]} bb cc dd ee xx
增刪查改baobao。
也可以使用${baobao[*]:1:3}表示去掉前一個(按編號),然后接著取3個(按編號)baobao數組的變量:
echo ${baobao[*]:1:3} bb cc dd
由于baobao[0]被刪除了,所以越過baobao[0]取接下來的baobao[1],baobao[2],baobao[3],于是得到bb cc dd
例題:使用冒泡排序法找出10個隨機數的最大值
[root@localhost bin]# cat funstest.sh #!/bin/bash for i in `seq 0 9`;do ran[$i]=$RANDOM if [ $i -eq 0 ];then max=${ran[$i]} elif [ ${ran[$i]} -gt ${ran[$[$i-1]]} ];then max=${ran[$i]} fi done echo ${ran[@]} echo "max: $max" [root@localhost bin]# bash funstest.sh 3232 5655 22990 30240 28066 15611 11885 7793 15777 13386 max: 15777
使用數組,非常簡單。
3.字符串處理
這里指的字符串處理是bash自帶功能的字符串處理,而不是通過cut命令之類的,同時字符串一般是由一個變量代表的。比如:
[root@localhost ~]# baobao=aaadfjaojsfpajfiqfkangiuowang [root@localhost ~]# echo ${baobao:3} dfjaojsfpajfiqfkangiuowang [root@localhost ~]# echo ${baobao:3:2} df
上述命令,第一個表示取baobao去掉前三個字符的字符串內容,后一個表示去掉前三個接著只取后續的兩個字符。
[root@localhost bin]# echo $baobao aaadfjaojsfpajfiqfkangiuowang [root@localhost bin]# echo ${baobao#*js} fpajfiqfkangiuowang [root@localhost bin]# echo ${baobao%js*} aaadfjao
上述命令#,%分別代表選取字符串的特定內容,#表示從左向右找到js以及js右側的內容,%表示從右向左找到js以及js左側的內容,這里#,%后面的word表示第一次找到的word,如果換成##,%%就會變成最后一次找到的word
[root@localhost bin]# baobao=dadsbabagwegwjkhwoibabakjrgjwp [root@localhost bin]# echo ${baobao##*baba} kjrgjwp [root@localhost bin]# echo ${baobao%%*baba} dadsbabagwegwjkhwoibabakjrgjwp
如上所述。
最后介紹轉換字符串大小寫的方法:
[root@localhost bin]# baobao=dadsbabagwegwjkhwoibabakjrgjwp [root@localhost bin]# echo ${baobao^^} DADSBABAGWEGWJKHWOIBABAKJRGJWP [root@localhost bin]# xx=`echo ${baobao^^}` [root@localhost bin]# echo $xx DADSBABAGWEGWJKHWOIBABAKJRGJWP [root@localhost bin]# echo ${xx,,} dadsbabagwegwjkhwoibabakjrgjwp
懂沒?不懂再學。
原創文章,作者:mcgeewang,如若轉載,請注明出處:http://www.www58058.com/39242
文章整體思路清晰,shell腳本函數和數組定義理解透徹,看完博客給人一中概覽性的認識,整篇博客讓人能看到很多專業性所在,還能看出很用心的地方,革命尚未成功,同志仍需努力啊,加油!