函数:函数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.178linux.com/38405