一、函数的两种定义方式
第一种:函数名(){ ...... }
第二种: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 0 ]; then # 默认为0 return else return 1 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 1` } user_list=`get_users` index=1 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 10 10 reduce 20 10 multiple 30 10 divide 40 10 sys_load
努力做一名出色的技术人!