函数介绍

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/nullif [ $? -eq 0 ];thenecho "Nginx is running well"sleep 5
elsesystemctl start nginxecho "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/nullif [ $? -eq 0 ];thenreturn 0elsereturn 1fi
}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
doecho "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 $var2test    # 调用test函数后,$var2就变成了全局变量echo $var1
echo $var2

在函数中也可以调用全局变量

#!/bin/bash
#var1="Hello world"function test
{var2=87
}echo $var1
echo $var2testecho $var1
echo $var2function test1
{echo $var2
}test1

  

如果函数中声明了局部变量,当函数执行完成后局部变量就会被销毁

#!/bin/bash
#var1="Hello world"function test
{local var2=87    # 局部变量,只在函数内部生效,生命周期只在函数内部
}testecho $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"echofree -mechoecho "Disk Usage"echodf -hecho
}

 

测试库函数

. /lib/base_function
sys_load

  

calculate.sh

#!/bin/bash
## 引入库函数,写绝对路径避免出错
. /lib/base_functionadd 12 23reduce 90 30multiple 12 12divide 12 2

库函数经验之谈:

  • 库文件名的后缀是任意的,但一般使用.lib
  • 库文件通常没有可执行权限
  • 库文件无需和脚本放在同级目录,只需要在脚本中引用时指定
  • 第一行一般使用#!/bin/echo,输出警告信息,避免用户执行

  

转载于:https://www.cnblogs.com/crazymagic/p/11071874.html

shell 函数的高级用法相关推荐

  1. Shell函数的高级用法

    Shell函数的高级用法 一.函数的定义和使用 1.语法格式 2.如何调用函数 3.示例演示 4.小脚本(nginx守护进程) 二.向函数传递参数 1.Shell中传参 2.Shell中函数调用 3. ...

  2. python用psf函数_Python 嵌套函数(高级用法)

    Python 嵌套函数(高级用法) 一.嵌套函数(高级用法) 1.嵌套函数 函数的嵌套调用是在"函数调用中再调用其他函数".也就是说:函数嵌套允许在一个函数中调用另外一个函数.如下 ...

  3. Python内置函数max()高级用法

    不管是排序还是选取最大值或者最小值,都应该有个规则或者顺序,而平时我们所说的最大值或最小值实际上也是在某种排序规则或顺序下的最大值和最小值.Python内置函数max().min()和sorted() ...

  4. Python中sorted()函数的高级用法详解

    sorted()函数的作用是对对象进行排序 函数函数格式: sorted(iterable,key,reverse),key参数可传入一个自定义函数 下边通过具体例子说明sorted的具体用法: 一维 ...

  5. Python内置函数int()高级用法

    int()函数常用来把其他类型转换为整数,例如: >>> int(3.2) 3 >>> int(1/3) 0 其实,int是Python内置类型之一,之所以能够当作 ...

  6. Go各种类型转换及函数的高级用法

    golang是强类型语言,在应用过程中类型转换基本都会用到.下面整理一下常用的类型转换,会持续更新. 整形转字符串 fmt.Println(strconv.Itoa(100)) 该方法的源码是: // ...

  7. offset函数的高级用法_数据验证(数据有效性)结合Offset函数 的综合用法

    #数据验证# 在2013版本以前称为#数据有效性#.数据验证主要用于验证数据的输入的准确性,避免输入非法值以及在输入非法值时能给出提示或警告.可以根据实际需要限制输入范围,提供预设值通过下拉列表选择输 ...

  8. print函数的高级用法(输出到文件,自定义间隔符,强制刷新)

    环境: Python3.6 python命令行输入: help(print) #help() 函数用于查看函数或模块用途的详细说明. 显示如下: >>> help(print) He ...

  9. python函数的高级用法

    传递列表 你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字.数字或更复杂的对象(如字典).将列表传递给函数后,函数就能直接访问其内容.下面使用函数来提高处理列表的效率. 假设有一个用户列表 ...

最新文章

  1. 皮一皮:周一之后还是周一?
  2. PAT甲级1082 Read Number in Chinese:[C++题解]字符串处理
  3. 智能车大赛信标组_第十五届全国大学生智能汽车竞赛在南京信息工程大学圆满闭幕...
  4. mysql 5.7 ddl 原子_mysql 8 新特性二DDL操作的原子化
  5. 每个人都应该读一读贝索斯的致股东信 1997-2016
  6. VC程序中实现控件的动态生成与响应
  7. day04【后台】角色维护
  8. PHP作用域和文件夹操作
  9. php mpdf 乱码,PHPMPDF中文乱码如何解决
  10. linux常用下载工具
  11. 基于PHP实现高性能敏感词过滤算法
  12. Android系统权限和root权限
  13. ios设置导航条背景图片
  14. Angular 路由(routing)基本配置
  15. 快速查看电脑内存型号方法
  16. Java 操作Word书签(一):添加、删除、读取书签
  17. [2017纪中10-25]嘟噜噜 约瑟夫问题 递推
  18. 编译原理算符分析器实现 -* c语言代码,C语言实现算符优先文法源代码(编译原理)...
  19. 论文阅读:Gradient Harmonized Single-stage Detector
  20. 计算机的规格介绍英语,电脑常见的一些英文(主板名称型号英文缩写)

热门文章

  1. java 文件流的处理 文件打包成zip
  2. Chapter6 Commodity Forwards
  3. H5外部浏览器直接调起微信——通过url协议 weixin:// 判断是否安装微信及启动微信...
  4. linux all version source code
  5. 超炫jQuery测试答题功能
  6. 最新微信公众平台js sdk整合PHP版
  7. android网络编程——HttpGet、HttpPost比较
  8. SystemVerilog——任务和函数(Tasks and Functions)[转]
  9. Ajax,再生还是幻灭---好文推荐
  10. 我在使用chrome经常使用的一些技巧