函数介绍

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 函数的高级用法的更多相关文章

  1. 2.shell编程-函数的高级用法

    2.1.函数的定义和使用 函数基本使用 [root@VM_0_9_centos ~]# test() > {} -bash: syntax error near unexpected token ...

  2. shell 变量的高级用法

    变量删除和替换 案例:从头开始匹配,将符合最短的数据删除 (#) variable_1="I love you, Do you love me" echo $variable_1 ...

  3. 网易云课堂_C++开发入门到精通_章节2:引用和函数的高级用法

    课时6函数重载 函数重载 在C语言头文件中的extern "C" //常见的C语言头文件格式 #ifndef _FUNC_ #define _FUNC_ #ifdef __cplu ...

  4. GO基础之函数的高级用法

    一.可变参数 支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. package main import "fmt" ...

  5. JavaScript函数的高级用法

    1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = functi ...

  6. 关于Oracle to_date函数的高级用法

    由于种种原因,在我们的系统中,账套期间(PERIOD_NAME)由于格式设置的原因,数据库层存储的格式如下 Mar-19,而不是常规的2019-03. 我们无法更改数据库,涉及到的点太多. 但是期间数 ...

  7. makefile高级用法--使用函数

    makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...

  8. shell 函数用法

    近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法. 我们为什么要用shell函数? 简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一 ...

  9. Linux之shell脚本for、while、case语句的高级用法

    1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...

随机推荐

  1. 用KNN实现iris的4分类问题&测试精度

    import matplotlib.pyplot as plt from scipy import sparse import numpy as np import matplotlib as mt ...

  2. 宣化上人:大佛顶首楞严经四种清净明诲浅释(10-11) -------------------------------------------------------------------------------- (转自学佛网:http://www.xuefo.net/nr/article23/230920.html)

    大佛顶首楞严经四种清净明诲浅释(10) 唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 是故阿难.若不断偷修禅定者.譬如有人.水灌漏卮.欲求其满.纵经尘劫.终无平复. 是故阿 ...

  3. HTML布局排版2 div的和图片平铺方便管理

    在HTML里,由于浏览器显示器等差异,浏览器的宽度也会有变化,为了适应不同的宽度,需要用到平铺.例如页面前面的固定的条等,如果是纯色,可以用背景色,如果不是纯色,是渐变等,可以用条状图平铺.常见的布局 ...

  4. 【Leetcode_easy】949. Largest Time for Given Digits

    problem 949. Largest Time for Given Digits solution: class Solution { public: string largestTimeFrom ...

  5. html5 横向滑动导航栏

    前提 需要引入: <script src="../assets/js/iscroll.js"></script> v4.2版本 ####html <! ...

  6. CF1237D Balanced Playlist

    思路:假设从第i首歌开始听,结束位置为j,那么从第i+1首歌开始听,结束位置一定不早于j.可以用反证法证明.想到这一点,就不难解决了. 实现: #include <bits/stdc++.h&g ...

  7. C++STL位标志、智能指针与异常处理

    参考<21天学通C++>第25章节,对STL位标志进行介绍.就是当需要不是像char int long 等整个字节数的数据表示形式,而是使用二进制位表示的时候,通常使用这里讲到的位标志.从 ...

  8. c# 无法加载DLL:找不到指定的模块(异常来自HRESULT:0X8007007E)

    c# 无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)的一个解决方法 以前的一个c#项目,今天运行的时候突然发现调用DLL时出现了下面的错误. 心中很诧异, ...

  9. 2019.12.4 Hystix熔断&Feign进行远程调用&Zuul

    0.学习目标 会配置Hystix熔断 会使用Feign进行远程调用 能独立搭建Zuul网关 能编写Zuul的过滤器 1.Hystrix 1.1.简介 Hystrix,英文意思是豪猪,全身是刺,看起来就 ...

  10. [Oracle] - 使用 DBMS_UTILITY 查看异常详情

    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE说明:这是在Oracle 10g数据库引入的,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE内置函数返回一 ...