shell脚本的函数介绍和使用案例
#前言:今天我们来聊聊shell脚本中的函数知识,看一下函数的优势,执行过程和相关的使用案例,我们也来看一下shell和python的函数书写方式有什么不同
#简介
、函数也具有别名类似的功能
、函数是把程序里多次调用相同的代码部分定义成一份,然后给这份代码定义个名字,如果出现重复的就调用就行了
#函数的优势
、把相同的程序段定义成函数,可以减少整个程序的代码量
、可以让程序代码结构更清晰
、增加程序的可读、易读性、以及管理性
、可以实现程序功能模块化,不同的程序使用函数模块化
#语法格式
函数名(){
    指令
    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() #调用函数
'''讲解执行的过程
.定义函数wan()
.调用函数wan()
.准备开始执行函数
.打印,今天一起去玩
.打印,去哪里完
.打印,我不知道
.函数执行完毕,本次调用完毕,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"
} return
#提示:不要放在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:
$ key beginservernum endservernum example:
$ ff "
} [[ $# != ]] && usage && exit 1 #如果传入的参数不等于3的话,就调用后面的函数,并退出脚本
[[ -z $ || -z $ || -z $ ]] && usage && exit 1 #如果传入的$1,$2,$3三个参数的值为空,那么就调用后面的函数,并退出脚本 [root@shell scripts]# sh hs02.sh 33 #当传入的参数不等于3个的时候就执行usage函数,并退出脚本
Usage:
hs02.sh key beginservernum endservernum example:
hs02.sh ff
#例7:将函数的传参转换成脚本文件命令行传参,判断任意指定的URL是否存在异常
[root@shell scripts]# cat hs03.sh
#!/bin/bash . /etc/init.d/functions function usage(){
echo $"usage:$0 url"
exit
} function check_url(){
wget --spider -q -o /dev/null --tries= -T $
if [ $? -eq ];then
action "$1 is success." /bin/true
else
action "$1 is failure." /bin/false
fi
} function main(){
if [ $# -ne ];then
usage
fi
check_url $
}
main $*
#参数解释
. /etc/init.d/functions #引入系统函数库
function usage(){ #帮助函数 function check_url(){ #检测URL函数
wget --spider -q -o /dev/null --tries= -T $ #--spider:判断网址是否有效,-q:不显示执行过程,-o:将软件输出信息保存到软件,-T:指定超时时间
action "$1 is success." /bin/true #action:调用系统函数库的用法 function main(){ #主函数
if [ $# -ne ];then #判断:如果传参的参数不等1个,那么久打印帮助函数,提示用户
check_url $ #接收函数的传输
main $* #$*:把命令行接收的所有参数作为函数参数传给函数内部
#测试
[root@shell scripts]# sh hs03.sh #如果没有加参数,就调用提示函数
usage:hs03.sh url
[root@shell scripts]# sh hs03.sh www.guokeboy.com #输入错误地址
www.guokeboy.com is failure. [FAILED](失败)
[root@shell scripts]# sh hs03.sh www.baidu.com #输入正确地址
www.baidu.com 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 ];then
echo "USAGE:$0 {red|green|yellow|blue|pink}" contents
exit
fi
} color(){
case "$1" in
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 ];then
usage
fi
color $ $
}
main $*
#参数解释
#.定义颜色变量
数字对应的颜色:(黑色)、(红色)、(绿色)、(黄色)、(蓝色、(粉红)、(青色)、(白色)
#.定义帮助函数
#.定义颜色函数,使用case来获取输入的值
#.主函数,判断输入的参数是否为2个,如果不是就调用帮助函数
#测试
#如果执行脚本,不加参数的话就打印帮助函数

#例9:使用shell函数开发rsync服务启动脚本
#使用start、stop、restart函数将代码 模块化,使用系统函数action优化显示
[root@shell init.d]# cat rsyncd
#!/bin/bash
#chkconfig:
#description: Rsyncd start scripts by guoke. . /etc/init.d/functions function usage(){
echo $"usage:$0 {start|stop|restart}"
exit
} function start(){
rsync --daemon
sleep
if [ `netstat -unplt | grep rsync | wc -l` -ge ];then
action "rsyncd is started." /bin/true
else
action "rsyncd is started." /bin/false
fi
} function stop(){
killall rsync &>/dev/null
sleep
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 ];then
usage
fi
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep
start
;;
*)
usage esac
}
main $*
#参数解释:引入系统函数库,定义帮助函数,然后定义start函数,stop函数,restart函数,定义主函数,主函数里面首先使用if判断传入的参数是不是为一个,如果不是就调用帮助函数,然后使用case语句获取传入的参数,再调用相关的函数,$*:把命令行接收的所有参数作为函数参数传给函数内部
#测试
[root@shell init.d]# sh rsyncd stop
rsyncd is stopped. [ OK ]
[root@shell init.d]# sh rsyncd start
rsyncd is started. [ OK ]
[root@shell init.d]# sh rsyncd restart
rsyncd is stopped. [ OK ]
rsyncd is started. [ OK ]
#总结:将脚本中功能进行模块化之后,就会使脚本比较易读和清晰,提升管理效率。好了,这次就分享到这了,写的不好地方还望指出,多多交流提高,下次再会。。。
shell脚本的函数介绍和使用案例的更多相关文章
- shell脚本编程基础介绍
		
Linux系统——shell脚本编程基础介绍 1.什么是shell 它是一个命令解释器,在linux/unix操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种操作输出的结果 ...
 - Linux Shell脚本编程-函数
		
函数介绍 定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数: 功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程. 注意: ...
 - Shell脚本之八 函数
		
一.函数定义 Linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; ...
 - Shell脚本(五)函数
		
总结下shell中的函数用法 #!/bin/bash function add_v1() { echo "call function add" } function add_v2( ...
 - Shell脚本学习 - 函数,输入输出重定向,文件
		
函数 函数定义 [ function ] funname [()] { action; [return int;] } 定义时可以是function fun(),也可以直接fun(),不带参数 返回值 ...
 - shell脚本之函数的使用
		
把代码封装成函数,相当于造了一个“轮子”,之后就直接重复使用即可. 函数的创建 shell中函数的创建有2种方式 1.使用function关键字 语法 function test { ... } 2. ...
 - shell脚本 4 函数与正则
		
shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式 func() { #指定函数名 ...
 - shell脚本之xargs使用的一些案例
		
首先看一下文本信息: # cat text1.txt 1 2 3 4 5 使用xargs格式化一下: # cat text1.txt | xargs 1 2 3 4 5 使用xargs格式化,每两个 ...
 - Shell 脚本进阶,经典用法及其案例
		
一.条件选择.判断 1.条件选择if (1)用法格式 if 判断条件 1 ; then 条件为真的分支代码 elif 判断条件 2 ; then 条件为真的分支代码 elif 判断条件 3 ; the ...
 
随机推荐
- nginx增加访问验证
			
使用OpenSSL实用程序创建密码文件 如果您的服务器上安装了OpenSSL,则可以创建没有附加软件包的密码文件.我们将在/ etc / nginx配置目录中创建一个名为.htpasswd的隐藏文件来 ...
 - 本地开启https服务
			
### ##自签名证书 ##配置Apache服务器SSL ##自己作为CA签发证书 ###这里是OpenSSL和HTTPS的介绍 OpenSSL HTTPS 开启HTTPS配置前提是已在Mac上搭建A ...
 - 某某项目SDV软件测试报告范例
			
说明:本范例为符合CMMI 5级要求的范例 Prepared by 拟制 小张 Date 日期 2008-04-09 Reviewed by 评审人 小丽.小王.小李.小莉.小三.小四.小猪.小猫.小 ...
 - linux Init分析(原创)
			
1.uboot的目标就是启动内核kernel: 2.kernel的目的就是启动应用程序,而第一个应用程序即是Init,构建根文件系统. 从uboot初始化配置后,引导内核的启动,启动函数为:start ...
 - 记一次苹果APP从账号续费到发布成功的历程
			
一.一波三折的续费 最近公司开发的苹果APP的SSL证书到期了,计划重新发布一下该APP,已替换即将到期的SSL证书.近几年随着钉钉.企业微信等在线办公软件超级平台的出现,各企业都会选择其中 ...
 - ASP.NET CORE 管道模型及中间件使用解读
			
说到ASP.NET CORE 管道模型不得不先来看看之前的ASP.NET 的管道模型,两者差异很大,.NET CORE 3.1 后完全重新设计了框架的底层,.net core 3.1 的管道模型更加灵 ...
 - 小白学 Python 数据分析(12):Pandas (十一)数据透视表(pivot_table)
			
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
 - Nginx的工作原理
			
Nginx 工作原理 Nginx由内核和模块组成. Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此locat ...
 - mupdf 基于命令行的 pdf转图片
			
下载地址: https://www.mupdf.com/downloads/index.html 使用方法: 打开cmd,切换到mupdf文件路径下,再在命令行中敲入命令 mutool.exe d ...
 - 有关vue中用element ui 中的from表单提交json格式总是有冒号的问题解决办法
			
因为后台要求要传递JSON格式的数据给他,然后我转了之后总是多了冒号,后来又看了自己的报错,原来是报了404错误,说明路径找不到, 数据格式 后来发现怎么都不行了,然后突然查看了报错报的是404,说明 ...