shell脚本的函数介绍和使⽤案例
#前⾔:今天我们来聊聊shell脚本中的函数知识,看⼀下函数的优势,执⾏过程和相关的使⽤案例,我们也来看⼀下shell和python的函数书写⽅式有什么不同
#简介
1、函数也具有别名类似的功能
2、函数是把程序⾥多次调⽤相同的代码部分定义成⼀份,然后给这份代码定义个名字,如果出现重复的就调⽤就⾏了
#函数的优势
1、把相同的程序段定义成函数,可以减少整个程序的代码量
2、可以让程序代码结构更清晰
3、增加程序的可读、易读性、以及管理性
4、可以实现程序功能模块化,不同的程序使⽤函数模块化
#语法格式
函数名(){
指令
return n
}
规范写法
function 函数名(){
指令
return n
}
#提⽰:shell的返回值是exit输出返回值,函数⾥⽤return输出返回值
#函数的执⾏
调⽤函数
#1、直接执⾏函数名即可(不带括号)
#注意
执⾏函数时,函数后的⼩括号不要带了
函数定义及函数整体必须在要执⾏的函数名的前⾯定义
#2、带参数的函数执⾏⽅法
函数名参数1 参数2
#提⽰:函数的传参和脚本的传参类似
#shell的位置参数($1 $2 $3 $4 $5 $# $* $? $@)都可以时函数的参数
#$0⽐较特殊,仍然是⽗脚本的名称
#在shell函数⾥⾯,return命令功能与shell⾥的exit类似,作⽤时跳出函数
#在shell函数⾥⾯使⽤exit会退出整个shell脚本,⽽不是退出shell函数
#return语句会返回⼀个退出值(返回值)给调⽤函数的程序
#我们来看⼀下python的函数书写⽅式
#提⽰:def是define的意思,定义
最基本的语法:
def 函数名():
函数体
  函数名() #调⽤函数
带有参数的语法
def 函数名(形参列表):
函数体(代码块,return)
函数名(实参列表) :调⽤
#看⼀下执⾏过程
# def wan():  #定义函数
#    print("今天⼀起去玩")
#    print("去哪⾥玩呢")
#    print("我不知道")
# wan()  #调⽤函数
'''讲解执⾏的过程
1.定义函数wan()
2.调⽤函数wan()
3.准备开始执⾏函数
4.打印,今天⼀起去玩
5.打印,去哪⾥完
6.打印,我不知道
7.函数执⾏完毕,本次调⽤完毕,wan()函数调⽤完毕
'''
#使⽤
#例1:没有去调⽤函数
[root@shell scripts]# pwd
/scripts
[root@shell scripts]# cat hs01.sh
#!/bin/bash
guoke(){
echo "I am guoke"
}
[root@shell scripts]# sh hs01.sh
[root@shell scripts]#  #如果没有去调⽤函数的话,那么就没有输出
#例2:调⽤函数
[root@shell scripts]# cat hs01.sh
#!/bin/bash
guoke(){
echo "I am guoke"
}
guoke  #调⽤函数
[root@shell scripts]# sh hs01.sh
I am guoke
#例3:多次调⽤
[root@shell scripts]# cat hs01.sh
#!/bin/bash
guoke(){
echo "I am guoke"
}
guoke
guoke
guoke
[root@shell scripts]# sh hs01.sh
I am guoke
I am guoke
I am guoke
#例4:将函数写到/etc/init.d/functions⾥⾯,然后通过其他脚本进⾏调⽤#/etc/init.d/functions
boy(){
echo "I am guoke-boy"
}
return0
#提⽰:不要放在return 0后⾯,要不然就是退出了,没有调⽤
[root@shell scripts]# cat hs01.sh  #通过脚本去调⽤boy函数
#!/bin/bash
. /etc/init.d/functions  #引⼊系统函数库
guoke(){
echo "I am guoke"
}
guoke
boy #调⽤/etc/init.d/functions中的函数
[root@shell scripts]# sh hs01.sh  #执⾏之后打印
I am guoke
I am guoke-boy
#例5:将函数写到/etc/init.d/functions⾥⾯,通过其他脚本进⾏调⽤然后传参
#/etc/init.d/functions
boy(){
echo "I am $1"
}
#提⽰:$1:脚本的传⼊的第⼀个参数
[root@shell scripts]# cat hs01.sh  #通过脚本去调⽤boy函数
#!/bin/bash
. /etc/init.d/functions  #引⼊系统函数库
guoke(){
echo "I am guoke"
}
guoke
boy guoke-boy #调⽤/etc/init.d/functions中的函数,后⾯接着传参
[root@shell scripts]# sh hs01.sh  #执⾏之后打印
I am guoke
I am guoke-boy
#例6:设置提⽰函数,如果传的参数的值不符合就打印帮助函数
[root@shell scripts]# cat hs02.sh
#!/bin/bash
usage(){
echo "Usage:
$0 key beginservernum endservernum
example:
$0 ff 12"
}
[[ $# != 3 ]] && usage && exit 1  #如果传⼊的参数不等于3的话,就调⽤后⾯的函数,并退出脚本
[[ -z $1 || -z $2 || -z $3 ]] && usage && exit 1 #如果传⼊的$1,$2,$3三个参数的值为空,那么就调⽤后⾯的函数,并退出脚本[root@shell scripts]# sh hs02.sh  2233  #当传⼊的参数不等于3个的时候就执⾏usage函数,并退出脚本
Usage:
hs02.sh key beginservernum endservernum
example:
hs02.sh ff 12
#例7:将函数的传参转换成脚本⽂件命令⾏传参,判断任意指定的URL是否存在异常
[root@shell scripts]# cat hs03.sh
#!/bin/bash
. /etc/init.d/functions
function usage(){
echo $"usage:$0 url"
exit 1
}
function check_url(){
wget --spider -q -o /dev/null --tries=1 -T 5 $1
if [ $? -eq 0 ];then
action "$1 is success." /bin/true
else
action "$1 is failure." /bin/false
fi
}
function main(){
if [ $# -ne 1 ];then
usage
fi
check_url $1
}
main $*
#参数解释
. /etc/init.d/functions  #引⼊系统函数库
function usage(){  #帮助函数
function check_url(){  #检测URL函数
wget --spider -q -o /dev/null --tries=1 -T 5 $1  #--spider:判断⽹址是否有效,-q:不显⽰执⾏过程,-o:将软件输出信息保存到软件,-T:指定超时时间    action "$1 is success." /bin/true  #action:调⽤系统函数库的⽤法
function main(){  #主函数
if [ $# -ne 1 ];then  #判断:如果传参的参数不等1个,那么久打印帮助函数,提⽰⽤户
check_url $1 #接收函数的传输
main $*  #$*:把命令⾏接收的所有参数作为函数参数传给函数内部
#测试
[root@shell scripts]# sh hs03.sh  #如果没有加参数,就调⽤提⽰函数
usage:hs03.sh url
[root@shell scripts]# sh hs03.sh  www.guokeboy  #输⼊错误地址
www.guokeboy is failure.                              [FAILED](失败)
[root@shell scripts]# sh hs03.sh www.baidu  #输⼊正确地址
www.baidu is success.                                  [  OK  ]
#例8:给任意字符串加指定颜⾊
[root@shell scripts]# cat hs04.sh
#!/bin/bash
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
PINK='\E[1;35m'
RES='\E[0m'
usage(){
if [ $# -ne 2 ];then
echo "USAGE:$0 {red|green|yellow|blue|pink}" contents
exit 1
fi
}
color(){
case"$1"in
shell脚本返回执行结果
red)
echo -e "${RED_COLOR} $2 ${RES}"
;;
green)
echo -e "${GREEN_COLOR} $2 ${RES}"
;;
yellow)
echo -e "${YELLOW_COLOR} $2 ${RES}"
;
;
blue)
echo -e "${BLUE_COLOR} $2 ${RES}"
;;
*)
usage
esac
}
main(){
if [ $# -ne 2 ];then
usage
fi
color $1 $2
}
main $*
#参数解释
#1.定义颜⾊变量
数字对应的颜⾊:30(⿊⾊)、31(红⾊)、32(绿⾊)、33(黄⾊)、34(蓝⾊、35(粉红)、36(青⾊)、37(⽩⾊)
#2.定义帮助函数
#3.定义颜⾊函数,使⽤case来获取输⼊的值
#4.主函数,判断输⼊的参数是否为2个,如果不是就调⽤帮助函数
#测试
#如果执⾏脚本,不加参数的话就打印帮助函数
#例9:使⽤shell函数开发rsync服务启动脚本
#使⽤start、stop、restart函数将代码模块化,使⽤系统函数action优化显⽰[root@shell init.d]# cat rsyncd
#!/bin/bash
#chkconfig: 23452080
#description: Rsyncd start scripts by guoke.
.
/etc/init.d/functions
function usage(){
echo $"usage:$0 {start|stop|restart}"
exit 1
}
function start(){
rsync --daemon
sleep 1
if [ `netstat -unplt | grep rsync | wc -l` -ge 1 ];then
    action "rsyncd is started." /bin/true
else
    action "rsyncd is started." /bin/false
fi
}
function stop(){
killall rsync &>/dev/null
sleep 2
if [ `netstat -unptl | grep rsync |wc -l` -eq 0 ];then
    action "rsyncd is stopped." /bin/true
else
    action "rsyncd is stopped." /bin/false
fi
}
function restart(){
stop
sleep 2
start
}
function main(){
if [ $# -ne 1 ];then
usage
fi
case"$1"in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
usage
esac
}
main $*

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。