函数

作者: 慕知 | 来源:发表于2020-12-29 12:38 被阅读0次

    一, 函数介绍

    1,函数定义

    1. 具备某一功能的工具 --> 函数
    2. 事先准备工具的过程 --> 定义函数
    3. 遇到应用场景拿过来用 --> 调用函数

    2, 函数的作用

    没有使用函数写脚本时,遇到重复的代码,只能复制粘贴,啰嗦麻烦问题有:
    1,代码可读性差
    2,可维护性,扩展性差

    3,如何使用函数

    原则:先定义,后调用

    二,函数的基本使用

    1, 定义函数的三种格式:

    格式一(建议使用):
    function f1() {
      代码1
      代码2
      代码3
    }
    
    
    格式二
    function f1 {
      代码1
      代码2
      代码3
    }
    
    
    
    格式三
    f1() {
      代码1
      代码2
      代码3
    }
    
    
    
    
    示例:
    [root@m01~]# vim /script/function.sh
    #!/bin/bash
    function f1() {
      echo "第一行...."
    }
    function f2 {
      echo "第二行..."
    }
    f3() {
      echo "第三行..."
    }
    f1
    f2
    f3
    
    
    
    [root@m01~]# /script/function.sh
    第一行....
    第二行...
    第三行...
    

    2, 函数的调用:

     
    f1  #无参调用
    f1  111 222 333 444  #有参调用
    
    1)
    [root@m01~]# vim /script/function1.sh
    #!/bin/bash
    function f1() {
        echo $1
        echo $2
        echo $3
        echo $*
        echo $@
    }
    f1 11 22 33 44 55
    
    
    
    [root@m01~]# /script/function1.sh
    11
    22
    33
    11 22 33 44 55
    11 22 33 44 55
    
    
    
    
    
    
    2)
    [root@m01~]# vim /script/function1.sh
    #!/bin/bash
    function f1() {
        echo $1
        echo $2
        echo $3
        echo $*
        echo $@
    }
    
    function f2() {
        expr $1 + $2
    }
    
    f2 19 1
    f2 12 8
    
    
    
    [root@m01~]# /script/function1.sh
    20
    20
    
    

    三,函数参数

    • 函数体代码 -----> 工厂内的流水线
    • 函数的参数 -----> 为工厂运送的原材料
    • 函数的返回值 -----> 流水线加工的产品

    四,函数的返回值

    return ----》函数内可以有多个return值,只要执行一个整个函数会立刻结束,return的值作为调用的值返回
    
    [root@m01~]# vim /script/return1.sh
    #!/bin/bash
    
    function f1(){
        echo 1111111
        return
        echo 222222
        return
        echo 3333
    }
    f1
    
    
    
    [root@m01~]# chmod +x /script/return1.sh
    [root@m01~]# /script/return1.sh
    1111111
    
    
    
    
    
    return后加上整型数 0-255
    示例一:
    [root@m01~]# vim /script/return1.sh
    #!/bin/bash
    
    function f1(){
        echo 1111111
        return 0
        echo 222222
        return
        echo 3333
    }
    f1
    echo $?
    
    
    返回值为0代表函数执行成功
    [root@m01~]# /script/return1.sh
    1111111
    0
    
    
    示例二:(函数内没有return值,返回值以最后一条为准)
    #!/bin/bash
    
    function f1(){
        echo 1111111
        echo 222222
        shduecho 3333
    }
    f1
    echo $?
    
    
    [root@stars ~]# ./cc.sh 
    1111111
    222222
    ./cc.sh: line 6: shduecho: command not found
    127
    
    
    
    
    示例三:
    #!/bin/bash
    
    function f1(){
        jdfhjecho 1111111
        echo 222222
        echo 3333
    }
    f1
    echo $?
    
    
    
    
    [root@stars ~]# ./cc.sh 
    ./cc.sh: line 4: jdfhjecho: command not found
    222222
    3333
    0
    # 函数内虽有报错,最后一条echo 3333可以输出,则返回值是0
    
    
    

    五,作用域

    1,局部作用域

    局部作用域,函数外的值是调用不到函数里的值4
    [root@m01~]# vim /script/return2.sh
    #!/bin/bash
    function ab(){
        local x=1
        echo "函数内的值为:$x"
    }
    ab
    echo "函数外的值为:$x"
    
    
    
    [root@m01~]# /script/return2.sh
    函数内的值为:1
    函数外的值为:
    
    

    2,全局作用域

    一定要加上local, 否则视为全局

    示例一
    #!/bin/bash
    z=2
    echo $z
    function ab(){
        echo "函数内的值为:$z"
    }
    #ab
    #echo "函数外的值为:$z"
    
    
    [root@m01~]# /script/return2.sh
    函数内的值为:2
    函数外的值为:2
    
    
    [root@m01~]# /script/return2.sh
    2
    
    
    [root@m01~]# echo $z
    
    直接$z得不出结果,因为脚本是在子bash进程中,
    [root@m01~]# echo $z  是在父bash进程
    
    
    用source执行或者. 空格,是在父bash重新执行,这样$z也有结果
    [root@m01~]# . /script/return2.sh
    2
    [root@m01~]# echo $z
    2
    
    
    
    这种情况下,可以另外写一个脚本,父bash执行脚本也可以调用值
    [root@m01~]# vim z.sh
    #!/bin/bash
    echo $z
    
    
    [root@m01~]# chmod +x z.sh
    [root@m01~]# . z.sh
    2
    
    
    示例二
    #!/bin/bash
    z=1
    function ab(){
        local z=2
        echo "函数内的值为:$z"
    }
    ab
    echo "函数外的值为:$z"
    
    
    [root@m01~]# /script/return2.sh
    函数内的值为:2
    函数外的值为:1
    
    
    
    
    
    示例三
    #函数外调用函数外的变量
    #!/bin/bash
    z=2
    function ab(){
        z=111
        echo "函数内的值为:$z"
    }
    echo "函数外的值为:$z"
    
    
    [root@m01~]# /script/return2.sh
    函数外的值为:2
    
    
    
    
    
    #调用函数在前,再取变量值
    #!/bin/bash
    z=2
    function ab(){
        z=111
        echo "函数内的值为:$z"
    }
    ab
    echo "函数外的值为:$z"
    
    
    [root@m01~]# /script/return2.sh
    函数内的值为:111
    函数外的值为:111
    
    
    
    
    #取变量值在前,再调用函数
    [root@m01~]# vim /script/return2.sh
    #!/bin/bash
    z=2
    function ab(){
        z=111
        echo "函数内的值为:$z"
    }
    echo "函数外的值为:$z"
    ab
    
    
    [root@m01~]# /script/return2.sh
    函数外的值为:2
    函数内的值为:111
    

    补充

    #在父bash里设置变量,再开一个子bash,就无法识别变量
     exit退出,即可再次识别
    
    [root@m01~]# a=11111
    [root@m01~]# echo $a
    11111
    [root@m01~]# bash
    [root@m01~]# echo $a
    
    
    [root@m01~]# exit
    [root@m01~]# echo $a
    11111
    
    
    
    
    # 使用export 就可以开启多个bash也可以识别变量
    [root@m01~]# w=5
    [root@m01~]# export w
    [root@m01~]# echo $w
    5
    [root@m01~]# bash
    [root@m01~]# echo $w
    5
    
    
    
    
    #如上虽然可以在多个子进程里也可以使用,重新打开一个终端也不能使用
    [root@m01~]# vim /etc/profile
    export w=5
    
    
    
    
    #再次打开个终端测试:
    root@10.0.0.61's password:
    Last login: Sun Dec 27 12:22:00 2020 from 10.0.0.1
    
    [root@m01~]# echo $w
    5
    

    相关文章

      网友评论

          本文标题:函数

          本文链接:https://www.haomeiwen.com/subject/ifftoktx.html