一、函数的两种定义方式
第一种:函数名(){ ...... }
第二种:function 函数名{ ...... }
调用时直接使用 函数名 调用,将函数当作一个“命令”即可。函数内部直接使用 $1、$2 ... $n
二、函数返回值有两种形式
- return
- echo
1、使用 return 返回值
- 利用 return 返回函数的返回值,取值范围为 1~255 的整数
- 函数使用 return 返回值,通过只是用来供其他地方调用获取状态,因此一般情况只会返回 0 或 1。0表示成功,1表示失败
例如:判断 nginx 进程是否启动:
#!/bin/bash
# 判断nginx是否启动 function is_run_nginx
{
status=$$
ps -ef | grep ngnix | grep -v grep | grep -v $status &> /dev/null
if [ $? -eq ]; then
# 默认为0
return
else
return
fi
}
# return返回值不能 赋值给某个变量,只能用作后续程序进行判断
# is_run=`is_run_nginx`
is_run_nginx && echo "nginx is running" || echo "nginx is stop"
2、使用 echo 返回值
- 使用 echo 可以返回任何字符串结果
- 通常用来返回数据,比如一个字符串值 或 列表值
举例:获取系统用户名
#!/bin/bash #使用echo 返回值,返回系统用户名 function get_users
{
# -d 指定分隔符,-f 指定取第几列
echo `cat /etc/passwd | cut -d : -f `
} user_list=`get_users` index=
for u in $user_list
do
echo "This is $index user: $u"
done
三、Shell 全局变量与局部变量
1、全局变量
- 不做特殊声明的话,默认都是全局变量
- Tips:大型脚本慎用全局变量
2、局部变量(只能声明在函数内)
- 定义变量时,使用 local 关键字
- 函数内外同时存在同名变量,函数内变量覆盖函数外变量
注意:如果函数没有调用,函数里面的变量是不会生效的。
#!/bin.bash var1="hello var1" function test
{
var2="hello var2"
local var3="hello var3"
} # test 没调用,var2,var3都不存在
echo $var1
echo $var2
echo $var3 test echo $var1
echo $var2
# var3 为局部变量,不能打印
echo $var3
打印结果:
hello var1
// test函数没调用,var2 不存在
// test函数没调用,var2 不存在
hello var1 hello var2
// var3 是局部变量,echo 一个空值
四、建立函数库
函数库存在的目的就是 将重复代码封装成函数文件。一般函数库不直接执行,而是供脚本进行调用
关于函数库的一些经验:
- 库文件名的后缀是任意的,一般建议使用 .lib
- 库文件一般没有可执行选项
- 库文件无需和脚本在同一级目录,只需在脚本中引用时指定
- 第一行一般使用 #!/bin/echo , 输出警告信息,避免用户执行。
举个例子:
定义一个函数库,该函数库实现一下几个函数:1、加法函数 add;2、减法函数 reduce;3、乘法函数 multiple;4、除法函数 devide;打印系统运行情况的函数 sys_load,该函数可以显示内存运行情况。
函数库如下:
function add
{
echo "`expr $1 + $2`"
} function reduce
{
echo "`expr $1 - $2`"
} function multiple
{
echo "`expr $1 \* $2`"
} function divide
{
echo "`expr $1 / $2`"
} function sys_load
{
echo "Memory Info"
echo
free -m
echo echo "Disk Usage"
echo
df -h
echo
}
引用函数库中的函数,当前 脚本 和 lib 在同一级目录。
#!/bin/bash # 引用函数库 lib/base_function
# 通过点 ". " 引入函数库
. lib/base_function.lib add reduce multiple divide sys_load