函数
简单地说,函数的作用就是将程序里面多次被调用的相同代码组合起来(函数体),并为其取个名字(函数名)。其他所有想重复调用这部分代码的地方,只需要调用这个名字就好了。可以把函数独立的写到文件里,当需要调用函数时候,再加载进来使用。下面是使用shell函数的有事:
把相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率
增加程序的可读、易读性、提升管理效率
可以实现程序功能模块化,使得程序具备通用性(可移植性)
对于Shell来说,Linux系统里面近2000个命令都可以说是shell的函数。所以shell的函数还是很多的,这一点需要读者注意
函数语法
shell函数的常见语法格式,其标准写法为:
function 函数名(){ # 推荐书写函数的方法(带括号)
指令集...
return n
}
简化写法1:
function 函数名 { # 不推荐使用此方法(无括号,函数名和左花括号之间需要有空格。)
指令集...
return n
}
简化写法2:
函数名(){ # 不用function的方法
指令集...
return n
}
函数执行
Shell函数分为最基本的函数和可以传参的函数两种,其执行方式分别说明如下:
不带参数的函数
不带参数的函数执行时,直接输入函数名即可(注意不带小括号)。格式如下:
函数名
有关执行函数的重要说明:
执行Shell函数时候,函数名前面的function和函数后的小括号都不要带
执行函数必须要在执行前定义或加载好(先定义再执行)
Shell执行系统中各种程序的顺序为:系统别名-->函数-->系统命令-->可执行文件
在Shell里面,return功能与exit类似,作用是退出函数,而exit是退出脚本文件。
如果函数存放于独立的文件中,被脚本加载使用时,需要使用source或者. 来加载。
函数执行时,会和调用它的脚本共用变量,也可以为函数设定局部变量以及特殊位置参数
在函数内一般使用local定义局部变量,这些变量离开后即消失。
带参数的函数
带参数的函数执行方法,格式如下
函数名 参数1 参数2
函数后接的参数说明:
Shell的位置函数(2...、
*、
@)都可以做作为函数的参数使用
此时父脚本的参数临时的被函数参数所掩盖或隐藏
$0比较特殊,依然是父脚本的名称
举例说明:
[root@oldboy ~]# cat func1.sh
#!/bin/bash
function hello(){
echo "hello $1"
}
hello oldchang
[root@oldboy ~]# sh func1.sh
hello oldchang
练习
通过以上举例,思考,如何把参数通过执行脚本传递给函数?
function hello(){
echo $*
}
hello $*
[root@shell ~]# sh hello.sh hello word
hello word
附录
0.1 监控Web服务和Mysql数据库服务是否异常的方法
1)端口监控 a.服务器本地监控服务端口的常见命令有:netstat、ss、lsof
b.从远端监控服务器本地端口的命令有telnet、nmap
2)对服务进程或者进程数监控 此方法适合本地服务器,注意,过滤的是进程名字,命令为
ps -ef | grep nginx | wc -l
ps -ef | grep mysql | wc -l
3)客户端模拟用户访问 使用wget或者curl命令进行测试(如果监测数据库则需要转为通过web服务器访问数据库),并对测试结果判断:
1) 利用返回值(echo $?)判断
2) 利用特殊字符串判断(需要事先开发程序)
3) 根据http响应header情况判断
4)登陆MySQL数据库判断 通过mysql客户端连接数据库,根据返回值或者返回内容判断,例如:mysql -uroot -peoor -e “select version()” &>/dev/null
示例:
# 使用第一种方式测试
netstat -ntlup | grep nginx | wc -l
ss -ntlup | grep nginx | wc -l
lsof -i :80 | wc -l
echo -e "\n" | telnet 127.0.0.1 22 2> /dev/null | grep Connected | wc -l
nmap 127.0.0.1 -p 22 | grep open | wc -l
# 使用第三种方式测试
wget -q 127.0.0.1:80 &> /dev/null ; echo $?
curl -s 127.0.0.1:80 2> /dev/null ; echo $?
0.2 自定义控制系统服务脚本
[root@oldboy ~]# cat /usr/lib/systemd/system/rsyncd_oldchang.service
[Unit]
Description=Rsync service
After=rsyncd_oldchang.target
[Service]
Type=forking
ExecStart=/etc/init.d/rsyncd start
ExecReload=/etc/init.d/rsyncd restart
ExecStop=/etc/init.d/rsyncd stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target