函数声明:
function_name () {
????list of commands
}
函数名 function_name,这就是你将使用它从其他地方在你的脚本调用。
function (功能) 功能函数
[root@localhost ~]# vim test.sh
a=10 # 全局变量
func1() {
local b=20 # 局部变量
echo $b
c=30 # 全局变量
}
func1 #调用函数
echo $a # 10
echo $b # 错误,b是func1的局部变量
echo $c # 30
?
//a 是全局变量,能在整个脚本内用
//b 是func1的局部变量,只在func1内可用
//c 是全局变量,定义在func1内,但属于整个脚本的变量
[root@localhost ~]# bash test.sh
20
10
?
30
总结:
在同一命名空间(同一个shell脚本)内定义的变量,能全局使用
局部变量只在函数定义它的地方有效,出了这个函数,就无法使用。
?返回值:return value
value不能超过0-255,是函数里面函数最后一条执行命令的返回值,默认返回值是由这条命令执行结果确定的
?[root@localhost ~]# vim re.sh
#!/usr/bin/bash
func(){
echo "hello"
# return 250 返回250并退出了函数,下面的语句不执行
if [ $? -eq 0 ];then
return 250 #返回的是执行函数的返回值
else
return 251
fi
}
func1(){
echo "hello"
}
func #调用函数func
echo $? #打印状态码,看看是否为250
func1 #调用函数func1
echo $? #打印状态码,看看是否为0
?//执行
[root@localhost ~]# bash re.sh
hello
250
hello
0
总结:
exit:返回结果并退出程序
return:返回结果并退出函数
函数的返回值,返回的是函数体内【最后一条命令】是否成功的返回值
?[root@localhost ~]# systemctl stop httpd
?[root@localhost ~]# systemctl stop vsftpd
?[root@localhost ~]# vim fun02.sh
#!/bin/bash
fun() {
systemctl status httpd &>/dev/null
systemctl status vsftpd &>/dev/null
}
fun
echo $?
?
?[root@localhost ~]# bash fun02.sh
3
取消函数 unset myfunc
[root@localhost ~]# vim fun01.sh
#!/bin/bash
fun () {
echo "hello"
}
fun #调用函数
unset fun #取消函数
fun #再次调用函数
?
[root@localhost ~]# bash fun01.sh
hello
fun01.sh: line 7: fun: command not found
[root@localhost ~]# cat a.sh
#!/usr/bin/bash
check_net() {
echo "正在检查网络通信"
ping -c1 www.baidu.com 2&> /dev/null
if [ $? -eq 0 ];then
echo "你的网络是没有问题的"
else
echo "你的网络有问题,请先检查网络"
exit 2
fi
}
check_net
echo "+++++++++++++++++++++++++++++++++++++++++++++"
check_yum() {
echo "正在检查yum源是否可用"
yum repolist
if [ $? -eq 0 ];then
echo "你的yum源可以正常使用"
else
echo "yum源不能用,请手动配置网络yum源"
exit 3
fi
}
#check_yum
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++"
install_nginx() {
#检查网络是否可以上网
check_net
echo "正在配置nginx的yum源"
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1
EOF
yum clean all && sleep 2
yum install -y nginx 2&> /dev/null
if [ $? -eq 0 ];then
echo "nginx install successfull and start nginx"
sleep 2
systemctl start nginx
if [ $? -eq 0 ];then
echo "nginx started is success,plaess check port!"
port=`netstat -lntp | grep nginx | awk '{print $4}' | awk -F ":" '{print $NF}'`
echo "nginx is port $port"
else
echo "nginx 启动失败,请手动检查!"
exit 4
fi
else
echo "nginx install failed!将会自动退出"
exit 5
fi
}
#install_nginx
//函数调用
[root@localhost ~]# cat b.sh #通过其他脚本调用函数脚本
#!/usr/bin/bash
while :
do
echo "这是服务器基本检测功能脚本"
echo "
++++++++++++++++++++++++++++++++++
+ 1. 检查yum源 +
+ 2. 检查网络 +
+ 3. 安装nginx +
+ 4. 退出 +
++++++++++++++++++++++++++++++++++
"
source ./a.sh #写你函数脚本的绝对路径,这里指的是执行函数脚本,让它为下面调用函数生效
read -p "请输入你的选项: " num
case $num in
1)
check_yum
;;
2)
check_net
;;
3)
install_nginx
;;
4)
exit;;
*)
echo "你输入的选项失败请重新输入"
esac
done
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n
的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数
[root@localhost ~]# vim fun03.sh
#!/bin/bash
if [ ! $# -eq 3 ];then
echo "Must Input Three number: " p1 p2 p3
exit
fi
fun() {
echo $[$1*$2*$3]
}
fun 1 2 3 #进行传参
[root@localhost ~]# bash fun03.sh 1 3 4 6 //这个时候只是传参到了脚本,并没有传到函数里面
Must Input Three number: p1 p2 p3
//修改版:
[root@localhost ~]# vim fun04.sh
fun() {
echo $[$1*$2*$3]
}
fun $1 $2 $3
[root@localhost ~]# bash fun04.sh 1 3 5
15