07·Shell编程-函数

2022-09-26 10:37:37 浏览数 (1)

  • 函数介绍
    • 什么是函数
    • 为什么要使用函数
    • 如何使用函数
    • 函数的语法
  • 函数参数 VS 脚本参数
  • 函数练习

-曾老湿, 江湖人称曾老大。


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


函数介绍

什么是函数

函数就是具备某一功能的工具

为什么要使用函数

如果不使用函数,那么你的代码: 1.程序的组织结构不清晰,可读性差 2.代码冗余 3.可扩展性(功能需要修改的时候...对不起GG)

如何使用函数

函数的使用必须遵循的原则:先定义,后调用 修理工事先准备好工具的过程,即,定义函数 修理工遇到应用场景哪来工具就用即函数的调用

函数的语法

函数定义语法

代码语言:javascript复制
function foo() {
  cmd1
  cmd2
  cmd3
}

function foo {
  cmd1
  cmd2
  cmd3
}

foo() {
  cmd1
  cmd2
  cmd3
}

#foo指函数名:就相当于一个变量名,指向函数的内存地址

## 函数优化,企业级,入职必做
:(){ : | : & };:

函数的调用语法

代码语言:javascript复制
直接使用函数名即可

函数传参语法

代码语言:javascript复制
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() {


}

0 人点赞