泰安網(wǎng)站建設(shè)538sw云優(yōu)化軟件
文章目錄
- 一、函數(shù)的定義
- 1.1 shell函數(shù):
- 1.2函數(shù)如何定義
- 二、函數(shù)的返回值
- 三、函數(shù)的傳參
- 四、函數(shù)變量的作用范圍
- 五、函數(shù)的遞歸
- 六、函數(shù)庫
一、函數(shù)的定義
1.1 shell函數(shù):
- 使用函數(shù)可以避免代碼重復
- 使用函數(shù)可以將大的工程分割為若干小的功能模塊,代碼的可讀性更強
1.2函數(shù)如何定義
法一:
[function] 函數(shù)名 (){命令序列[return x]
}法二:
函數(shù)名(){命令序列
}
二、函數(shù)的返回值
1、在函數(shù)內(nèi)用return退出函數(shù)并返回函數(shù)的值,在函數(shù)外用echo $?獲取返回值,注:返回值的范圍只能在0~255,超過部分需除以256取余
編寫一個腳本查看他的返回數(shù)
執(zhí)行腳本
可以看出$?的返回值是有上限的,返回值的范圍只能在0~255,超過部分需除以256取余
2、在函數(shù)內(nèi)用echo輸出值,在函數(shù)體外可用變量=$(函數(shù)名)獲取函數(shù)的返回值
編寫一個腳本
執(zhí)行腳本
可以看出相較于$?沒有取值的范圍。
三、函數(shù)的傳參
在Shell中,調(diào)用函數(shù)時可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過 $n 的形式來獲取參數(shù)的值,例如,$1表示第一個參數(shù),$2表示第二個參數(shù)…即使用位置參數(shù)來實現(xiàn)參數(shù)傳遞。
示例:
結(jié)果:
示例:
結(jié)果:
函數(shù)體內(nèi)部的$1 $2代表的是調(diào)用函數(shù)時,函數(shù)后面跟的位置參數(shù)
函數(shù)體外的$1 $2代表的是執(zhí)行腳本時,腳本后面跟的位置參數(shù)
在函數(shù)體內(nèi)部的$#
代表調(diào)用函數(shù)時,函數(shù)后面跟的參數(shù)個數(shù)
在函數(shù)體內(nèi)部的$@ $*
代表調(diào)用函數(shù)時,函數(shù)后面跟的所有參數(shù)
在函數(shù)體外時,$#
代表腳本后面跟的參數(shù)個數(shù)
在函數(shù)體外時,$@ $*
代表腳本后面跟的所有參數(shù)
四、函數(shù)變量的作用范圍
1、函數(shù)在Shell腳本中僅在當前腳本Shell環(huán)境中有效(使用source/. 執(zhí)行腳本,也會影響系統(tǒng)的當前Shell環(huán)境)
2、Shell腳本中變量默認全局有效
3、將變量限定在函數(shù)內(nèi)部使用local命令
4、系統(tǒng)Shell環(huán)境>>腳本Shell環(huán)境>>函數(shù)Shell環(huán)境
示例一:
[root@localhost ~]# vim test5.sh
#!/bin/bash
myfun () {echo $namename=fengchuecho $name
}
name=wolong
myfun
echo $name
[root@localhost ~]# sh test5.sh
wolong
fengchu
fengchu
實例二:
[root@localhost ~]# vim test5.sh
#!/bin/bash
myfun () {echo $namelocal name=fengchuecho $name
}
name=wolong
myfun
echo $name
[root@localhost ~]# sh test5.sh
wolong
fengchu
wolong
五、函數(shù)的遞歸
遞歸就是一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身。執(zhí)行遞歸函數(shù)將反復調(diào)用其自身,每調(diào)用一次就進入新的一層。所以遞歸要有兩個基本要素,結(jié)束條件與遞推關(guān)系。
遞歸的兩個基本要素:
????1.邊界條件:確定遞歸到何時結(jié)束,也被稱為遞歸的出口
????2.遞歸所使用的模式:大問題分解成小問題。遞歸函數(shù)只有具有上述兩個條件,才能計算出結(jié)果。
示例一:求階乘
#!/bin/bash
fact() {
if [ $1 -eq 1 ]
thenecho 1
elselocal temp=$[$1-1]local res=$(fact $temp)echo $[$1 * $res]
fi
}
read -p "請輸入一個數(shù):" n
res=$(fact $n)
echo $res
[root@localhost opt]# sh digui.sh
請輸入一個數(shù):5
120
[root@localhost opt]# sh digui.sh
請輸入一個數(shù):6
720
示例二:使用遞歸查詢目錄
使用函數(shù)遞歸目錄/var/log,如果是文件直接輸出文件名,如果是目錄則輸出目錄名且輸出此目錄下的所有目錄和文件名
[root@localhost opt]# vim digui2.sh
#!/bin/bash
list () {
for f in $(ls $1)
doif [ -d "$1/$f" ]thenecho "$2這是目錄$f"list "$1/$f" " $2"elseecho "$2這是文件$f"fi
done
}
list "/opt" " "
[root@localhost opt]# sh digui2.sh這是目錄aa這是目錄bb這是目錄cc這是目錄dd這是文件123.txt這是文件digui2.sh這是文件digui.sh這是目錄rh這是文件test2.sh這是文件test3.sh這是文件test4.sh這是文件test.sh
六、函數(shù)庫
如果我們能擁有,或者編寫過很多有價值的函數(shù)(能夠具體實現(xiàn)某一功能的那種函數(shù)),我們在想運用的時候希望能夠跨文件調(diào)用,這些在Linux中shell腳本也能實現(xiàn),只要進行函數(shù)庫文件的搭建,后期就能在編寫腳本時進行直接調(diào)用
-
函數(shù)庫所存文件為普通文件即可,但是函數(shù)的格式一定要規(guī)范,有能傳參的設(shè)置。
-
后面進行調(diào)用時可以通過 “.”和“source”來進行跨文件調(diào)用
創(chuàng)建一個函數(shù)庫
[root@localhost opt]# vim ku.sh
#!/bin/bash
jiafa(){echo $[$1 + $2]
}jianfa(){echo $[$1 - $2]
}chengfa(){echo $[$1 * $2]
}chufa(){if [ $2 -eq 0 ]thenecho "除數(shù)不可為0"elseecho $[$1 / $2]fi
}fact(){if [ $1 -eq 1 ];thenecho 1elif [ $1 -gt 1 ]thenlocal tmp=$[$1 - 1]local res=$(fact $tmp)echo $[$1 * res]elseecho "輸入的值無效,請輸入大于等于1的整數(shù)!"fi
}
在其他的shell腳本中執(zhí)行函數(shù)
[root@localhost opt]# vim test6.sh
#!/bin/bash
. /opt/ku.shread -p "請輸入一個正整數(shù):" num1
read -p "請輸入二個正整數(shù):" num2res1=$(jiafa $num1 $num2)
res2=$(jianfa $num1 $num2)
res3=$(chengfa $num1 $num2)
res4=$(chufa $num1 $num2)
res5=$(fact $num1 $num2)echo "加法的結(jié)果為:$res1"
echo "減法的結(jié)果為:$res2"
echo "乘法的結(jié)果為:$res3"
echo "除法的結(jié)果為:$res4"
echo "階乘的結(jié)果為:$res5"
[root@localhost opt]# sh test6.sh
請輸入一個正整數(shù):5
請輸入二個正整數(shù):2
加法的結(jié)果為:7
減法的結(jié)果為:3
乘法的結(jié)果為:10
除法的結(jié)果為:2
階乘的結(jié)果為:120