- 函数介绍
- 什么是函数
- 为什么要使用函数
- 如何使用函数
- 函数的语法
- 函数参数 VS 脚本参数
- 函数练习
-曾老湿, 江湖人称曾老大。
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
函数介绍
什么是函数
函数就是具备某一功能的工具
为什么要使用函数
如果不使用函数,那么你的代码: 1.程序的组织结构不清晰,可读性差 2.代码冗余 3.可扩展性(功能需要修改的时候...对不起GG)
如何使用函数
函数的使用必须遵循的原则:先定义,后调用 修理工事先准备好工具的过程,即,定义函数 修理工遇到应用场景哪来工具就用即函数的调用
函数的语法
函数定义语法 |
---|
function foo() {
cmd1
cmd2
cmd3
}
function foo {
cmd1
cmd2
cmd3
}
foo() {
cmd1
cmd2
cmd3
}
#foo指函数名:就相当于一个变量名,指向函数的内存地址
## 函数优化,企业级,入职必做
:(){ : | : & };:
函数的调用语法 |
---|
直接使用函数名即可
函数传参语法 |
---|
function foo() {
args=$1
cmd1
cmd2
cmd3
}
举例 |
---|
函数分为两个阶段: 1.调用阶段:运行函数体代码 2.定义阶段:只检测语法,不执行代码
代码语言:javascript复制#!/bin/bash
#Author: _DriverZeng_
#Name: _Print Message_
max (){
x=$1
y=$2
if [ $x -gt $y ];then
echo $x
else
echo $y
fi
}
max
[root@zabbix01 ~]# sh foo.sh 1 2
# 传参无效,所以这里面我们需要知道,bash的参数和函数的参数不是一个
函数参数 VS 脚本参数
特殊变量 | 脚本 | 函数 |
---|---|---|
$N | 脚本的第N个参数 | 函数的第N个参数 |
$0 | 脚本名称 | 脚本名称 |
$*/$@ | 脚本的所有参数 | 函数的所有参数 |
$# | 脚本传递的参数个数 | 函数传递的参数个数 |
函数的返回值 |
---|
函数的返回值,需要注意: 在Python中 1.返回值没有类型限制 2.返回值没有个数限制 1)如果返回1个值:调用函拿到的结果就是一个值 2)如果返回多个值:调用函数拿到的结果就是一个元组 3)如果返回0个值:调用函数拿到的结果就是None
在Shell中 1.函数返回值,必须是numeric,数字
代码语言:javascript复制## 字符串类型报错
foo.sh: line 15: return: zls: numeric argument required
2.返回值有个数限制,只能写一个返回值
代码语言:javascript复制## 多个返回值报错
foo.sh: line 15: return: too many arguments
返回值的作用很重要,方便我们后续的判断,包括变量的传递,在这里说可能体现不出来,后续我们写脚本的时候用到,就明白了。
函数练习
1.优化之前的脚本
2.写一个源码安装nginx的脚本
3.使用shell模拟ansible的模块,非常非常非常非常的烧脑,写到脑裂。
下面是一个不完整的脚本,写了一部分发现,mmp,不想写了,ansible太强大了,但是为了让大家更好的熟悉shell,我会上课带着大家写一点屡一点思路。
代码语言:javascript复制#!/bin/bash
if [ $2 != '-m' ];then
echo "Usage: $0 hostname -m module -a action"
fi
# ansible 10.0.0.61 -m 'file' -a ""
module_judge (){
module=$2
if [ $module == 'file' ];then
zls_file $4
fi
}
zls_file (){
for n in $*;do
if [[ $n =~ 'src' ]];then
src=`echo "${n}"|awk -F '=' '{print $2}'`
elif [[ $n =~ 'dest' ]];then
dest=`echo "${n}"|awk -F '=' '{print $2}'`
elif [[ $n =~ 'mode' ]];then
mode=`echo "${n}"|awk -F '=' '{print $2}'`
elif [[ $n =~ 'owner' ]];then
owner=`echo "${n}"|awk -F '=' '{print $2}'`
fi
done
cp -a $src $dest
chown ${owner:-root}.${owner:-root} ${dest}
chmod ${mode:-600} ${dest:-600}
}
main() {
}