1.函数的作用:
函数的作用就是把程序里多次调用相同代码部分定义成一份,然后为这一份代码起个名字,其它所有的重复调用这部分代码就都只用这个函数名即可。当需要修改这部分重复代码时,只需要改变函数体内的一份代码即可实现所以有调用修改。
使用函数的优势:
① 把相同的程序段定义成函数,可以减少整个程序的代码量
② 增加程序的可读性
③ 可以实现程序功能模块化,不同的程序使用函数模块化
④ 可以让程序结构更清晰
⑤ 相同的代码模块可重复调用
强调:对于shell来说,linux系统的2000个命令都可以说是shell的函数。
2.shell函数语法:
语法格式:
简单语法格式:
函数名(){
指令...
return n
}
规范语法格式:
function 函数名(){
指令...
return n
}
提示:shell的返回值是exit输出返回值,函数里用return输出返回值。
3.shell函数的执行
调用函数:
①直接执行函数名即可(不带括号)
函数名
注意:
a.执行函数时,函数名后不要带小括号
b.函数定义函数体必须在要执行的函数名的前面定义,shell的执行从上到下按行执行的。
②带参数的函数执行方法:
函数名 参数1 参数2
提示:函数的传参和脚本的传参类似,只是脚本名换成函数名即可
【函数后接的参数说明】
a.shell的位置参数($1、$2、$3、$4、$5、$#、$*、$?以及$@)都可以是函数的参数。
注:Linux shell脚本中一些参数的含义:
$# 是传给脚本的参数个数
b.此时父脚本的参数临时地被函数参数所掩盖或隐藏
c.$0比较特殊,它仍然是父脚本的名称
d.当函数完成时,原来的命令行脚本参数即恢复
e.在shell函数里面,return命令功能与shell里的exit类似,作用是跳出函数
f.在shell函数体里面使用exit会退出整个shell脚本,而不是退出shell函数
g.return语句会返回一个退出值(返回值)给调用函数的程序
h.函数的参数变量是在函数体里面定义,如果是普通变量一般会使用local i定义
4.函数范例:
定义一个函数脚本:
#!/bin/sh
fun01test(){
echo "I am a function!!"
}
fun01test ==>调用函数fun01test
在上述函数脚本中引用另一个脚本里的函数:
[root@localhost ~]# cat fun01.sh
#!/bin/sh
. /root/fun02test.sh ==>引入另一个函数所在的脚本文件
fun01test(){
echo "I am a function!!"
}
fun01test
fun02 ==>执行所需调用的函数名称
定义一个传参函数并执行:
[root@localhost ~]# cat fun02test.sh
#!/bin/sh
fun02(){
echo "This is first parameters: $1"
}
fun02 111
fun02 aaa
fun02 b1a1
[root@localhost ~]# sh fun02test.sh
This is first parameters: 111
This is first parameters: aaa
This is first parameters: b1a1
注意:给函数传递参数时,不是执行脚本文件后面跟传递的参数,是在调用函数时传递
实例1:
函数传参转出脚本命令行传参,对任意指定URL判断是否异常。
分步解答:
1.脚本传参检查web url是否正常。
2.检查的功能写成函数。
3.函数传参转成脚本命令行传参,对任意指定URL判断是否异常。
方法一:
#!/bin/sh
[ -f /etc/init.d/functions ]&& . /etc/init.d/functions
usage(){
echo "USAGE:$0 url"
exit 1
}
RETVAL=0
CheckUrl(){
wget -T 10 --spider -t 2 $1 &>/dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then
action "$1 url" /bin/true
else
action "$1 url" /bin/false
fi
return $RETVAL
}
main(){
if [ $# -ne 1 ];then
usage
fi
CheckUrl $1
RETVAL=$?
return $RETVAL
}
main $*