概念
函数就是将你需要执行的shell命令组合起来,组成一个函数体。一个完整的函数包括函数头和函数体,其中函数名就是函数的名字。
优点
- 将相同的程序,定义,封装为一个函数,能减少程序的代码数量,提高开发效率。
- 使用函数,能让你写更少的代码,早点写完,早点回家休息多好。
- 函数能够增加代码的可读性,易读性,容器管理。
函数的实际开发
shell函数定义的语法
# 标准shell函数定义
function 函数名() {
函数体
你想执行的Linux命令
return 返回值
}
# 偷懒写法
# 当使用function关键字时候,可以省略括号
function 函数名 {
函数体
你想执行的那些命令。。。。
return 返回值
}
# 超人懒人写法,shell老司机的时候
# 必须有括号
函数名() {
函数体
代码。。。
return 返回值
}
# 执行该函数
函数名
执行函数的基础概念
有关函数执行的基本概念
- 执行shell函数,直接写函数名字即可,无需添加其他内容
- 函数必须先定义,在执行,shell脚本自上而下加载
- 函数体内定义的变量,称之为局部变量
- 函数体内需要添加return语句,作用是退出函数,且赋予返回值给调用该函数的程序,也就是shell脚本
- return语句和exit不同
- return是结束函数的执行,返回一个(退出值、返回值)
- exit是结束shell环境,返回一个(退出值、返回值)给当前的shell
- 函数如果单独写入一个文件里,需要用source读取
- 函数内,使用local关键字,定义局部变量
函数实践
场景1:
xiao123@xiao123:~/Downloads/shscripts$ cat ./func1.sh
#! /bin/bash
function chaochao() {
cd /tmp
echo "我准备创建一个文件,且写入信息"
echo "爱的魔力转圈圈" > ./music.txt
return 0
}
chaochao
xiao123@xiao123:~/Downloads/shscripts$
运行结果:
xiao123@xiao123:~/Downloads/shscripts$ bash ./func1.sh
我准备创建一个文件,且写入信息
xiao123@xiao123:~/Downloads/shscripts$ ls /tmp/
message.txt
music.txt
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ cat /tmp/music.txt
爱的魔力转圈圈
xiao123@xiao123:~/Downloads/shscripts$
场景2:
函数定义和执行,分开在不同的文件中,Linux自带的诸多脚本,都是基于该形式使用的。
- 函数写在一个文件中,只定义,不执行
- 另外一个脚本,读取该文件,且加载该函数
1. 先定义一个my_function.c脚本,作用是只记录函数,不运行
xiao123@xiao123:~/Downloads/shscripts$ cat my_function.sh
#!/bin/bash
chao(){
echo "我是函数,我被执行~你真棒"
}
xiao123@xiao123:~/Downloads/shscripts$
2.如何检查当前的shell环境变量
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
xiao123@xiao123:~/Downloads/shscripts$
3.利用source命令读取shell脚本,能够加载其变量到当前shell环境中
xiao123@xiao123:~/Downloads/shscripts$ source my_function.sh
xiao123@xiao123:~/Downloads/shscripts$
4.再次验证
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$
5.可以推出当前shell,再次登录,查看该环境变量
exit
xiao123@xiao123:~$ chao
Command 'chao' not found, did you mean:
command 'chaos' from deb emboss (6.6.0+dfsg-11ubuntu1)
command 'chat' from deb ppp (2.4.9-1+1ubuntu3)
Try: apt install <deb name>
xiao123@xiao123:~$
xiao123@xiao123:~/Downloads/shscripts$ source my_function.sh
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$ chao
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$
使用脚本加载chao,并执行
xiao123@xiao123:~/Downloads/shscripts$ cat fun3.sh
#! /bin/bash
[ -f ./my_function.sh ] && . my_function.sh || exit -1
chao
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh #启动子shell,在子shell中加载
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ chao
\Command 'chao' not found, did you mean:
command 'chat' from deb ppp (2.4.9-1+1ubuntu3)
command 'chaos' from deb emboss (6.6.0+dfsg-11ubuntu1)
Try: apt install <deb name>
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ source fun3.sh # 在当前shell中加载
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$ chao
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$
bash 开启子shell执行,source使用当前shell执行
函数处理参数
函数可以处理来自命令行传到shell脚本中的参数。
my_function.sh
xiao123@xiao123:~/Downloads/shscripts$ cat my_function.sh
#!/bin/bash
chao(){
echo "我是函数,我被执行~你真棒"
}
helloPyyu(){
echo "兄台,你传入的脚本参数,依次是 $1 $2 $3,并且参数个数一共是$#"
}
xiao123@xiao123:~/Downloads/shscripts$
fun3.sh
xiao123@xiao123:~/Downloads/shscripts$ cat fun3.sh
#! /bin/bash
[ -f ./my_function.sh ] && . my_function.sh || exit -1
helloPyyu $1 $2 $3
xiao123@xiao123:~/Downloads/shscripts$
运行结果
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh
兄台,你传入的脚本参数,依次是 ,并且参数个数一共是0
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh 2131 4543 5646 45645
兄台,你传入的脚本参数,依次是 2131 4543 5646,并且参数个数一共是3
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh 2131 4543 5646
兄台,你传入的脚本参数,依次是 2131 4543 5646,并且参数个数一共是3
xiao123@xiao123:~/Downloads/shscripts$
函数实战开发
- 检测url是否正常,要求是函数开发形式
xiao123@xiao123:~/Downloads/shscripts$ cat check_url.sh
#!/bin/bash
usage() {
echo "Usage: $0 url"
exit 1
}
check_url() {
wget --spider -q -o /dev/null --tries=1 -T 5 $1
if [ $? -eq 0 ]
then
echo "$1 is running..."
else
echo "$1 is down..."
fi
}
main() {
if [ $# -ne 1 ]
then
usage
fi
check_url $1
}
main $*
xiao123@xiao123:~/Downloads/shscripts$
运行结果
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.com
www.baidu.com is running...
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.coms
www.baidu.coms is down...
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.coms fd
Usage: check_url.sh url
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh
Usage: check_url.sh url
xiao123@xiao123:~/Downloads/shscripts$
美化脚本
xiao123@xiao123:~/Downloads/shscripts$ cat check_url.sh
#!/bin/bash
. /lib/lsb/init-functions
usage() {
echo "Usage: $0 url"
exit 1
}
check_url() {
wget --spider -q -o /dev/null --tries=1 -T 5 $1
if [ $? -eq 0 ]
then
log_success_msg echo "$1 is running..."
else
log_failure_msg "$1 is down..."
fi
}
main() {
if [ $# -ne 1 ]
then
usage
fi
check_url $1
}
main $*
xiao123@xiao123:~/Downloads/shscripts$
运行结果: