函數:函數function是由若干條shell命令組成的語句塊,實現代碼 重用和模塊化編程
1)函數的定義: 可在 命令行,腳本的一部分,只有函數的單獨文件 中定義
兩部分組成:函數名和函數體;函數體可帶有返回狀態值 return #
-語法一:
function f_name {
…函數體…
}
-語法二:
f_name() {
…函數體…
}
命令行下定義并調用函數
]#dir (){ ls;} ]#dir
2)函數的調用: 函數只有被調用時才會執行
給定函數名:
無參數調用 f_name
有參數調用 f_name arg1 arg2 …
函數被調用時創建,返回時終止。
命令行下: 定義函數后可直接調用 使用 #unset f_name 撤銷函數
腳本中: 函數定義后才可使用,應將函數放在腳本開始部分
函數文件: 將常用函數寫入函數文件,在命令行或腳本中加載該函數文件即可調用函數
#set 查看所有已加載函數 #unset 刪除函數
加載函數:
source /path/to/filename
. /path/to/filename
加載函數文件
]#vi echo.sh #!/bin/bash #zjj print_haha (){ echo haha } ]#source echo.sh ]#print_haha ]#haha
3)函數參數
傳遞參數給函數:
f_name arg1 arg2..
函數體可使用$1,$2,…調用對應參數;$@,$*,$#等同樣可用
注意 此處的的$1.$2與執行腳本時的參數不同,僅為調用函數時后面添加的參數
4)函數變量
注意 函數體中變量的操作會影響到整個腳本,
可在函數中定義局部變量,只對函數體有效,使用local
local var_name=value
5)函數的遞歸
函數直接或間接調用自身
注意遞歸層數
=== 函數練習:
1.寫一個服務腳本/root/bin/testsrv.sh
#!/bin/bash #zjj testsrv() { bsname=`basename $0` local Srvpath=/var/lock/subsys/$bsname case $1 in start) if [ -e $Srvpath ] ;then echo + $bsname is running else touch $Srvpath && echo ++ start successful fi ;; stop) if [ -e $Srvpath ] ;then rm -f $Srvpath &&echo -- stop successful else echo - $bsname is dead fi ;; restart) testsrv stop && testsrv start ;; status) [ -e $Srvpath ] &&echo + $bsname is running... ||echo - $bsname is stopped... ;; *) testsrv status ;; esac } testsrv $1
2.編寫一個腳本/root/bin/copycmd.sh ,復制命令及其庫文件
#!/bin/bash #zjj copycmd() { # create directiry if they does not exist local dpath='/testdir/sysroot' for dir in `echo $PATH|tr ':' ' '` "/lib" "/lib64" ;do [ -e ${dpath}${dir} ] &&continue ||mkdir -p ${dpath}${dir} done while true ;do read -p "++enter a command or [quit]:" cmd [[ $cmd =~ quit ]] &&exit 23 spath=`whereis -b $cmd 2>/dev/null|cut -d ' ' -f2` ! [ $? -eq 0 ] && echo invalid command &&continue cp -a $spath ${dpath}$spath &&echo copy $spath ++succesful ||echo --error for so in `ldd $spath |sed -nr 's/.*> ([^[:space:]].*) \(.*/\1/p'`;do cp -n $so ${dpath}$so &&echo -e "copy $so \t++successful" ||echo --error done done } copycmd
3.寫一個函數實現兩個數字做為參數,返回最大值
#!/bin/bash #zjj max (){ [ $1 -gt $2 ]&&echo max:$1||echo max:$2 } max $1 $2
4.斐波那契數列
#!/bin/bash #zjj fibo() { if [ $1 -le 1 ];then echo $1 elif [ $1 -gt 1 ];then echo "$[$(fibo $[$1-1])+$(fibo $[$1-2])]" fi } if ! [ $1 -eq $1 ]&>/dev/null||[ $1 -lt 0 ]&>/dev/null||[ -z $1 ] ;then echo please enter a integer &&exit 23 else for((i=0;i<=$1;i++));do fibo $i done fi
5.漢諾塔解決
#!/bin/bash #zjj # move n-1 : A to B # move n : A to C # move n-1 : B to C hanoi() { if [ $1 -eq 1 ];then echo $2 to $4 else hanoi $[$1-1] $2 $4 $3 echo $2 to $4 hanoi $[$1-1] $3 $2 $4 fi } hanoi $1 A B C
原創文章,作者:Jasper,如若轉載,請注明出處:http://www.www58058.com/38405