shell 函数的高级用法
函数介绍
linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用
语法格式
如何调用函数
shell终端中定义函数
[root@master day3]# test() > { > echo "test function"; > }
练习;时刻监听 nginx的进程,失败重启
nginx_daemon.sh
#!/bin/bash # # 获取脚本子进程的pid,如果脚本名称中带nginx,也会当成nginx进程 this_pid=$$ while true do ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null if [ $? -eq 0 ];then echo "Nginx is running well" sleep 5 else systemctl start nginx echo "Nginx is down,Start it..." fi done
启动脚本
sh nginx_daemon.sh
一系统守护进程运行
nohup sh nginx_daemon.sh &
查看日志
tail -f nohup.out
向函数传递参数
一些高级语言传递参数
高级语言函数调用
shell 中函数传参
shell 中函数调用
简单小示例
[root@master day3]# function greeeting > { > echo "hello $1" > }
向函数传递参数: 函数传参和给脚本传参类似,都是使用$1 $2 $3 $4 $5 $6 $7这种方式
例子1:
需求描述:写一个脚本,该脚本可以实现计算器的功能,可以进行+-*/四种运算。
calucate.sh
#!/bin/bash # function calcu { case $2 in +) echo "`expr $1 + $3`" ;; -) echo "`expr $1 - $3`" ;; '\*') echo "`expr $1 \* $3`" ;; /) echo "`expr $1 / $3`" ;; esac } calcu $1 $2 $3
函数的返回值
返回值的方式
使用 return 返回值
使用 echo 返回值
案例1 判断nginx进程是否存在
函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败
nginx.sh
#!/bin/bash # this_pid=$$ function is_nginx_running { ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null if [ $? -eq 0 ];then return 0 else return 1 fi } is_nginx_running && echo "nginx is running" || echo "nginx is stopped"
执行脚本
sh nginx.sh
查看脚本进程的执行过程
sh -x nginx.sh
案例2 获取系统中的用户
使用echo返回值 使用echo可以返回任何字符串结果 通常用于返回数据,比如一个字符串值或者列表值
get_sys_user.sh
#!/bin/bash # # 获取系统所有的用户名 function get_users { users=`cat /etc/passwd | cut -d: -f1` echo $users } # 定义一个变量将获取用户列表赋值给这个变量 user_list=`get_users` index=1 for u in $user_list do echo "the $index user is : $u" index=$(($index+1)) done
执行脚本
sh get_sys_user.sh
shell函数中的局部变量和全局变量
全局变量
局部变量
var.sh
#!/bin/bash # var1="Hello world" function test { var2=87 } echo $var1 echo $var2
调用test函数后,$var2就变成了全局变量
#!/bin/bash # var1="Hello world" function test { var2=87 } echo $var1 echo $var2 test # 调用test函数后,$var2就变成了全局变量 echo $var1 echo $var2
在函数中也可以调用全局变量
#!/bin/bash # var1="Hello world" function test { var2=87 } echo $var1 echo $var2 test echo $var1 echo $var2 function test1 { echo $var2 } test1
如果函数中声明了局部变量,当函数执行完成后局部变量就会被销毁
#!/bin/bash # var1="Hello world" function test { local var2=87 # 局部变量,只在函数内部生效,生命周期只在函数内部 } test echo $var1 echo $var2
函数库
为什么要定义函数库
函数库示例:
定义一个函数库,该函数库实现以下几个函数:
- 1.加法函数add add 12 89
- 2.减法函数reduce reduce 90 30
- 3.乘法函数multiple multiple 12 10
- 4.除法函数divide divide 9 3
- 5.打印系统运行情况的函数sys_load,该函数可以显示内存运行情况,磁盘使用情况
cat /lib/base_function
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/base_function sys_load
calculate.sh
#!/bin/bash # # 引入库函数,写绝对路径避免出错 . /lib/base_function add 12 23 reduce 90 30 multiple 12 12 divide 12 2
库函数经验之谈:
- 库文件名的后缀是任意的,但一般使用.lib
- 库文件通常没有可执行权限
- 库文件无需和脚本放在同级目录,只需要在脚本中引用时指定
- 第一行一般使用#!/bin/echo,输出警告信息,避免用户执行