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,输出警告信息,避免用户执行
shell 函数的高级用法的更多相关文章
- 2.shell编程-函数的高级用法
2.1.函数的定义和使用 函数基本使用 [root@VM_0_9_centos ~]# test() > {} -bash: syntax error near unexpected token ...
- shell 变量的高级用法
变量删除和替换 案例:从头开始匹配,将符合最短的数据删除 (#) variable_1="I love you, Do you love me" echo $variable_1 ...
- 网易云课堂_C++开发入门到精通_章节2:引用和函数的高级用法
课时6函数重载 函数重载 在C语言头文件中的extern "C" //常见的C语言头文件格式 #ifndef _FUNC_ #define _FUNC_ #ifdef __cplu ...
- GO基础之函数的高级用法
一.可变参数 支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. package main import "fmt" ...
- JavaScript函数的高级用法
1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = functi ...
- 关于Oracle to_date函数的高级用法
由于种种原因,在我们的系统中,账套期间(PERIOD_NAME)由于格式设置的原因,数据库层存储的格式如下 Mar-19,而不是常规的2019-03. 我们无法更改数据库,涉及到的点太多. 但是期间数 ...
- makefile高级用法--使用函数
makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...
- shell 函数用法
近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法. 我们为什么要用shell函数? 简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一 ...
- Linux之shell脚本for、while、case语句的高级用法
1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...
随机推荐
- 《楞严经四种清净明诲》 (转自学佛网:http://www.xuefo.net/nr/article56/559965.html)
<楞严经四种清净明诲> 佛告阿难:“汝常闻我毗奈耶中,宣说修行三决定义.所谓摄心为戒,因戒生定,因定发慧,是则名为三无漏学. “阿难,云何摄心,我名为戒? “若诸世界六道众生其心不淫,则不 ...
- [导航教程] [C#基类库大全]官方产品发布与源码下载---苏飞版
http://www.sufeinet.com/thread-655-1-1.html
- python中的随机函数random的用法示例
python中的随机函数random的用法示例 一.random模块简介 Python标准库中的random函数,可以生成随机浮点数.整数.字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据 ...
- CompletableFuture Quasar 等并发编程
CompletableFuture基本用法 https://www.cnblogs.com/cjsblog/p/9267163.html Quasar https://blog.csdn.net/ma ...
- 【Leetcode_easy】908. Smallest Range I
problem 908. Smallest Range I solution: class Solution { public: int smallestRangeI(vector<int> ...
- beego框架(golang)学习过滤器(实现restful请求)
过滤器 在用beego做restful路由的时候,遇到了除了GTE.POST之外的HTTP请求,比如 PUT.PATCH.delete请求无法通过路由认证,报错误:405 METHOD NOT ALL ...
- 兔子问题(Rabbit problem)
Description 有一种兔子,出生后一个月就可以长大,然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对.现在,我们有一对刚出生的这种兔子,那么,n 个月过后,我们会有多少 ...
- crontab每小时运行一次
先给出crontab的语法格式 对于网上很多给出的每小时定时任务写法,可以说绝大多数都是错误的!比如对于下面的这种写法: 00 * * * * #每隔一小时执行一次 00 */1 * * * #与上面 ...
- C++ 生成 voronoi 图 & C++生成泰森多边形图形
1. 功能 生成voronoi图的一个类 2. 代码 VoronoiDiagramGenerator.h #pragma once //Microsoft Visual Studio 2015 Ent ...
- Python12之列表3(列表常用操作符,以及常用的内置函数)
一.比较操作符: list1 > list2 比较两个列表的大小,Python会直接从列表的第0个元素进行比较,若相等,则继续下一个比较 得到的结果是布尔值 二.逻辑操作 ...