shell编程系列6--shell中的函数
- shell编程系列6--shell中的函数
- .函数介绍
- linux shell中的函数和大多数编程语言中的函数一样
- 将相似的任务或者代码封装到函数中,供其他地方调用
- 语法格式
- 第一种格式
- name()
- {
- command1
- command2
- ......
- commondn
- }
- 第二种格式
- function name
- {
- command1
- command2
- ......
- commondn
- }
- .调用函数
- 直接使用函数名调用,可以将其想象成shell中的一条命令
- 函数内部可以直接使用参数 $、$...$n
- 调用函数:function_name $ $
- shell终端中定义函数
- [root@es01 shell]# test()
- > {
- > echo "test function"
- > }
- [root@es01 shell]#
- [root@es01 shell]# test
- test function
- [root@es01 shell]# function greeting
- > {
- > echo "hello,zhangsan"
- > }
- [root@es01 shell]# greeting
- hello,zhangsan
- 练习;nginx的守护进程
- [root@es01 shell]# cat 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 ];then
- echo "Nginx is running well"
- sleep
- else
- systemctl start nginx
- echo "Nginx is down,Start it..."
- fi
- done
- [root@es01 shell]# nohup sh nginx_daemon.sh &
- []
- [root@es01 shell]# nohup: ignoring input and appending output to ‘nohup.out’
- [root@es01 shell]# tail -f nohup.out
- Nginx is running well
- Nginx is running well
- Nginx is running well
- Nginx is running well
- .向函数传递参数
- 高级语言传参
- int example_1(int arg1,int arg2)
- {
- arg1=arg2
- ...
- ...
- return null
- }
- 高级语言函数调用
- int num1=;
- int num2=;
- 调用函数形式一:int num3=example_1(num1,num2);
- 调用函数形式二:
- int num4;
- num4=example_1(num1,num2);
- shell中传参
- function name
- {
- echo "Hello $1"
- echo "Hello $2"
- }
- shell中函数调用
- 函数调用:name Lily Allen
- [root@es01 shell]# function greeting
- > {
- > echo "hello zhangsan"
- > }
- [root@es01 shell]# greeting
- hello zhangsan
- # 调用参数
- [root@es01 shell]# function greeeting
- > {
- > echo "hello $1"
- > }
- [root@es01 shell]# greeeting jack
- hello jack
- [root@es01 shell]# greeeting tom
- hello tom
- 向函数传递参数:
- 函数传参和给脚本传参类似,都是使用$ $ $ $ $ $ $7这种方式
- 例子1:
- 需求描述:写一个脚本,该脚本可以实现计算器的功能,可以进行+-*/四种运算。
- 例如:sh calculate.sh + | sh calucate.sh -
- [root@es01 shell]# cat calucate.sh
- #!/bin/bash
- #
- function calcu
- {
- case $ in
- +)
- echo "`expr $1 + $3`"
- ;;
- -)
- echo "`expr $1 - $3`"
- ;;
- \*)
- echo "`expr $1 \* $3`"
- ;;
- /)
- echo "`expr $1 / $3`"
- ;;
- esac
- }
- calcu $ $ $
- [root@es01 shell]# sh calucate.sh +
- [root@es01 shell]# sh calucate.sh -
- -
- .函数的返回值
- 方法一 return
- 方法二 echo
- 使用return返回值
- 使用return返回值,只能返回1-255的整数
- 函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败
- # 判断nginx进程是否存在
- [root@es01 shell]# cat 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 ];then
- return
- else
- return
- fi
- }
- is_nginx_running && echo "nginx is running" || echo "nginx is stopped"
- [root@es01 shell]# sh nginx.sh
- nginx is running
- [root@es01 shell]# systemctl stop nginx
- [root@es01 shell]# sh nginx.sh
- nginx is stopped
- [root@es01 shell]# sh -x nginx.sh
- + this_pid=
- + is_nginx_running
- + ps -ef
- + grep nginx
- + grep -v grep
- + grep -v
- + '[' -eq ']'
- + return
- + echo 'nginx is stopped'
- nginx is stopped
- 使用echo返回值
- 使用echo可以返回任何字符串结果
- 通常用于返回数据,比如一个字符串值或者列表值
- # 获取系统中的用户
- [root@es01 shell]# cat get_sys_user.sh
- #!/bin/bash
- #
- # 获取系统所有的用户名
- function get_users
- {
- users=`cat /etc/passwd | cut -d: -f1`
- echo $users
- }
- # 定义一个变量将获取用户列表赋值给这个变量
- user_list=`get_users`
- index=
- for u in $user_list
- do
- echo "the $index user is : $u"
- index=$(($index+))
- done
- [root@es01 shell]# sh get_sys_user.sh
- the user is : root
- the user is : bin
- the user is : daemon
- the user is : adm
- the user is : lp
- the user is : sync
- the user is : shutdown
- the user is : halt
- the user is : mail
- the user is : operator
- the user is : games
- the user is : ftp
- the user is : nobody
- the user is : systemd-network
- the user is : dbus
- the user is : polkitd
- the user is : sshd
- the user is : postfix
- the user is : ajie
- the user is : chrony
- the user is : elasticsearch
- the user is : nginx
- .shell函数中的局部变量和全局变量
- 不做特殊声明,shell中变量都是全局变量
- 大型脚本程序函数中慎用全局变量
- 局部变量:
- 在函数内部定义局部变量时,使用local关键字
- 函数内和函数外若同时存在变量,函数内部变量会覆盖外部变量
- #
- [root@es01 shell]# cat var.sh
- #!/bin/bash
- #
- var1="Hello world"
- function test
- {
- var2=
- }
- echo $var1
- echo $var2
- # 因为函数test没有被调用,所以变量 $var2 没有生效,为空
- [root@es01 shell]# sh var.sh
- Hello world
- [root@es01 shell]#
- # 调用test函数后,$var2就变成了全局变量
- [root@es01 shell]# cat var.sh
- #!/bin/bash
- #
- var1="Hello world"
- function test
- {
- var2=
- }
- echo $var1
- echo $var2
- test # 调用test函数后,$var2就变成了全局变量
- echo $var1
- echo $var2
- [root@es01 shell]# sh var.sh
- Hello world
- Hello world
- # 在函数中也可以调用全局变量
- [root@es01 shell]# cat var.sh
- #!/bin/bash
- #
- var1="Hello world"
- function test
- {
- var2=
- }
- echo $var1
- echo $var2
- test
- echo $var1
- echo $var2
- function test1
- {
- echo $var2
- }
- test1
- [root@es01 shell]# sh var.sh
- Hello world
- Hello world
- # 如果函数中声明了局部变量,当函数执行完成后局部变量就会被销毁
- [root@es01 shell]# cat var.sh
- #!/bin/bash
- #
- var1="Hello world"
- function test
- {
- local var2= # 局部变量,只在函数内部生效,生命周期只在函数内部
- }
- test
- echo $var1
- echo $var2
- [root@es01 shell]# sh var.sh
- Hello world
- [root@es01 shell]#
- .函数库
- 为什么需要定义函数库?
- 经常使用的重复代码可以封装成函数文件,功能函数,程序工具
- 函数库文件一般不直接执行,而是由其他脚本调用
- 函数库示例:
- 定义一个函数库,该函数库实现以下几个函数:
- .加法函数add
- add
- .减法函数reduce
- reduce
- .乘法函数multiple
- multiple
- .除法函数divide
- divide
- .打印系统运行情况的函数sys_load,该函数可以显示内存运行情况,磁盘使用情况
- # 定义库函数
- [root@es01 shell]# 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
- }
- # 测试库函数
- [root@es01 shell]# . lib/base_function
- [root@es01 shell]# sys_load
- Memory info
- total used free shared buff/cache available
- Mem:
- Swap:
- Disk Usage
- Filesystem Size Used Avail Use% Mounted on
- /dev/mapper/centos-root 49G .3G 46G % /
- devtmpfs .9G .9G % /dev
- tmpfs .9G .9G % /dev/shm
- tmpfs .9G 12M .9G % /run
- tmpfs .9G .9G % /sys/fs/cgroup
- /dev/sda1 297M 125M 172M % /boot
- /dev/mapper/centos-data 49G 33M 49G % /data
- tmpfs 378M 378M % /run/user/
- # 调用库函数
- [root@es01 shell]# cat calculate.sh
- #!/bin/bash
- #
- # 引入库函数,写绝对路径避免出错
- . /data/shell/lib/base_function
- add
- reduce
- multiple
- divide
- 经验之谈:
- 库文件名的后缀是任意的,但一般使用.lib
- 库文件通常没有可执行权限
- 库文件无需和脚本放在同级目录,只需要在脚本中引用时指定
- 第一行一般使用#!/bin/echo,输出警告信息,避免用户执行
shell编程系列6--shell中的函数的更多相关文章
- shell编程系列1--shell脚本中的变量替换
shell编程系列1--shell脚本中的变量替换 变量替换总结: .${变量#匹配规则} # 从头开始匹配,最短删除 .${变量##匹配规则} # 从头开始匹配,最长删除(贪婪模式) .${变量%匹 ...
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中
shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...
- shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...
- shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句
shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动 ...
- shell编程系列17--文本处理三剑客之awk动作中的表达式用法
shell编程系列17--文本处理三剑客之awk动作中的表达式用法 awk动作表达式中的算数运算符 awk动作中的表达式用法总结: 运算符 含义 + 加 - 减 * 乘 / 除 % 模 ^或** 乘方 ...
- shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容
shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容 删除命令对照表 命令 含义 1d 删除第一行内容 ,10d 删除1行到10行的内容 ,+5d 删除10行到16行的内容 /p ...
- shell编程系列7--shell中常用的工具find、locate、which、whereis
shell编程系列7--shell中常用的工具find.locate.which.whereis .文件查找之find命令 语法格式:find [路径] [选项] [操作] 选项 -name 根据文件 ...
- C#)Windows Shell 编程系列5 - 获取图标
原文 C#)Windows Shell 编程系列5 - 获取图标 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 编程系列4 - 上下 ...
随机推荐
- 如何使用MCUXpresso IDE创建一个Cortex-M工程
拿到Cortex-M开发板之后,就可以开始使用MCUXpresso IDE上手入门.在这个教程中,我们将详细介绍如何基于CMSIS(Cortex微控制器软件接口标准)在MCUXpresso IDE中为 ...
- 清除PLSQL Developer访问数据库连接的历史记录
1.C盘下 路径: C:\Users\JourneyOfFlower\AppData\Roaming\PLSQL Developer 12\Preferences\JourneyOfFlower\ J ...
- TODO 竞品分析方法——关于导航评测的一些笔记
参考:移动App性能评测与优化 chapter4讲了地图怎么测,虽然不测地图,但是里面有关竞品分析的部分写得非常好,很多解决方案真的很精彩.记录一下. 我之前的竞品分析测试,通常是很简单的竞品数据层面 ...
- IOT设备通讯,MQTT物联网协议,MQTTnet
一.IOT设备的特性 硬件能力差(存储能力基本只有几MB,CPU频率低连使用HTTP请求都很奢侈) 系统千差万别(Brillo,mbedOS,RIOT等) 如使用电池供电,电量消耗敏感 如果是小设备, ...
- 2019-2020-1 20199312《Linux内核原理与分析》第十二周作业
实验背景 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,学生需要亲手重现攻击来理解该漏洞,并回答一些问题. ...
- select下拉选中显示对应的div隐藏不相关的div
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 运算符 & | ^ ~ >> << 讲解
字节”是byte,“位”是bit :1 byte = 8 bit : char 在java中是2个字节.java采用unicode,2个字节(16位)来表示一个字符. char 16位2个字节 byt ...
- 获取当前主题颜色 Flutter
通过context获取当前主题颜色 Theme.of(context).accentColor
- learning java Random 和 ThreadLocalRandom类
var rand = new Random(); System.out.println(rand.nextBoolean()); System.out.println(rand.nextInt()); ...
- 28、对多次使用的RDD进行持久化或Checkpoint
一.图解 二.说明 如果程序中,对某一个RDD,基于它进行了多次transformation或者action操作.那么就非常有必要对其进行持久化操作,以避免对一个RDD反复进行计算. 此外,如果要保证 ...