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 - 上下 ...
随机推荐
- SpringCloud学习心得之Eureka注册中心的基本使用
SpringCloud学习心得——Eureka注册中心 示范代码链接 定义 SpringCloud Eureka是 SpringCloud Netflix微服务套件的一部分,基于 REST 的服务 ...
- python3 tkinter模块
一.tkinter 1.tkinter--tool kit interface工具包接口,用于GUI(Graphical User Interface)用户图形界面, 2.python3.x把Tkin ...
- linux系统编程综合练习-实现一个小型的shell程序(四)
上节中已经对后台作业进行了简单处理,基本上要实现的功能已经完了,下面回过头来,对代码进行一个调整,把写得不好的地方梳理一下,给代码加入适当的注释,这种习惯其实是比较好了,由于在开发的时候时间都比较紧, ...
- flask基础2
一个装饰器无法装饰多个函数的解决方法 当我们想在flask的多个视图函数前添加同一个装饰器时,如果什么都不做会报一个错 AssertionError: View function mapping is ...
- keras模块学习之-目标函数(objectives)笔记
本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! 目标函数又称损失函数(loss),目的是计算神经网络的输出与样本标记的差的一种方法,如: model = Sequential() ...
- myeclipse常用快捷键和小技巧
常用快捷键: Ctrl + Shift + R 在整个项目中查找文件 Ctrl + H 查找文件,可以限定文件中包含的内容 Ctrl + Shift + G 查找一个方法在哪里被调用 Ctrl + O ...
- NETTY框架的使用
一.Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程 ...
- webuploader+php如何实现分片+断点续传
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- 洛谷 P1950 长方形_NOI导刊2009提高(2) 题解
P1950 长方形_NOI导刊2009提高(2) 题目描述 小明今天突发奇想,想从一张用过的纸中剪出一个长方形. 为了简化问题,小明做出如下规定: (1)这张纸的长宽分别为n,m.小明讲这张纸看成是由 ...
- springboot项目获取resource下的文件
package com.expr.exceldemo; import org.springframework.core.io.ClassPathResource; public class Test ...