函数介绍

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. Spring cloud微服务安全实战-5-7实现基于session的SSO(客户端应用的Session有效期)

    授权模式改造成了Authorization code完成了改造的同时也实现了SSO.微服务环境下的前后端分离的单点登陆. 把admin的服务重启.刷新页面 并没有让我去登陆,直接就进入了首页. ord ...

  2. 零基础学Python-第一章 :Python介绍和安装-03.Python的安装

    官方版本的python下载以及安装方法,以及pycharm的安装和打开. 社区版就可以完全支持我们的需求了. 点击左侧的图片到右边. 在命令行输入python3 exit() 退出命令行的编辑器. p ...

  3. MySQL数据库查找多个字段值全部相同的记录

    数据库中用户表,数据从第三方系统导入,由于一些垃圾数据,存在用户名和密码都相同的账户,造成接口上一些问题,SQL语句如下: and Account2>;

  4. LeetCode_202. Happy Number

    202. Happy Number Easy Write an algorithm to determine if a number is "happy". A happy num ...

  5. UITableView实现行纵向颜色渐变

    实现效果如下: 其实实现很简单,开始觉得使用颜色值和tableView的indexPath.row挂钩使用即可 或者使用CAGradientLayer实现渐变 最后使用alpha实现即可.需要注意的是 ...

  6. 【Leetcode_easy】905. Sort Array By Parity

    problem 905. Sort Array By Parity solution1: class Solution { public: vector<int> sortArrayByP ...

  7. Github克隆代码慢问题解决办法

    参考:https://blog.csdn.net/stone8761/article/details/79072148 https://blog.csdn.net/github_37847975/ar ...

  8. 10点睛Spring4.1-Application Event

    10.1 Application Event Spring使用Application Event给bean之间的消息通讯提供了手段 应按照如下部分实现bean之间的消息通讯 继承Application ...

  9. 用MATLAB的Classficiation Learner工具箱对12个数据集进行各种分类与验证

    准备材料 以所有的特征集作为variable进行像Bayes吖.SVM吖.决策树吖......分类.同时对数据进行预处理,选出相关度高的特征子集作为新的一组data进行分类(预处理的代码不必放出来). ...

  10. WXS-运算符