• Shell脚本函数简介及运用


    目录

    一、函数的作用

    二、定义函数

    三、调用函数

    1.在脚本中调用函数

    2.在函数中调用函数

    四、函数传参

    五、函数的返回值

    六、函数的递归

    七、函数及其变量的作用范围

    八、外部脚本调用函数


    一、函数的作用

    1. 语句块定义成函数约等于别名,定义函数,再引用函数
    2. 封装的可重复利用的具有特定功能的代码

    二、定义函数

            定义函数就是只将一段实现某个任务的命令序列封装进一个函数,便于使用和后期维护。

    function 函数名() {
        命令序列
    }
     
    函数名() {
        命令序列
    }

    1. [root@localhost1 func]#vim definite.sh
    2. #!/bin/bash
    3. #定义函数运算()
    4. function yunsuan() {
    5. a=2
    6. b=3
    7. jia=$[ $a + $b ]
    8. jian=$[ $a - $b]
    9. echo "相加等于:$jia"
    10. echo "相减等于:$jian"
    11. }

    三、调用函数

            定义过的函数需要调用才能执行其中的命令序列。

    1.在脚本中调用函数

    1. [root@localhost1 func]#vim definite.sh
    2. #!/bin/bash
    3. function yunsuan() {
    4. a=2
    5. b=3
    6. jia=$[ $a + $b ]
    7. jian=$[ $a - $b]
    8. echo "相加等于:$jia"
    9. echo "相减等于:$jian"
    10. }
    11. #直接在脚本中写入函数名
    12. yunsuan
    13. [root@localhost1 func]#bash definite.sh
    14. 相加等于:5
    15. 相减等于:-1

    2.在函数中调用函数

    1. [root@localhost1 func]#vim definite.sh
    2. #!/bin/bash
    3. function jiajian() {
    4. a=10
    5. b=3
    6. jia=$[ $a + $b ]
    7. jian=$[ $a - $b]
    8. echo "相加等于:$jia"
    9. echo "相减等于:$jian"
    10. }
    11. function chengchu() {
    12. a=10
    13. b=3
    14. cheng=$[ $a * $b ]
    15. chu=$[ $a / $b]
    16. echo "相乘等于:$cheng"
    17. echo "相除等于:$chu"
    18. }
    19. #调用上两个函数
    20. yunsuan() {
    21. jiajian
    22. chengchu
    23. }
    24. yunsuan
    25. [root@localhost1 func]#bash definite.sh
    26. 相加等于:13
    27. 相减等于:7
    28. 相乘等于:30
    29. 相除等于:3

    四、函数传参

            在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。例如:$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。

    注意

    • 当我们执行脚本时跟的参数,对应的是脚本中的位置变量
    • 当我们执行函数时跟的参数,对应的是函数中的位置变量

            虽然都表示为$1、$2,但我们执行一个函数时,传入的参数只跟其输入函数的顺序有关,与输入脚本时传入参数的顺序无关。

    1. [root@localhost1 ~]#vim chuancan.sh
    2. #!/bin/bash
    3. test1() {
    4. jian=$[ $1 - $2 ] #脚本中的$1对应先传入的30,$2对应后传入的50
    5. echo "相减的值为:$jian"
    6. }
    7. test1 $2 $1 #执行函数时,先传入30($2),再传入50($1)
    8. [root@localhost1 ~]#bash chuancan.sh 50 30 #执行脚本时传入参数 $1对应50 $2对应30
    9. 相减的值为:-20

    五、函数的返回值

            return 表示退出函数并返回一个退出值,脚本中可以用$?变量表示该退出值(状态码

    在函数中的使用原则

    • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
    • 退出状态码必须是0~255,超出时值将为除以256取余。
    状态码含义
    0执行成功
    非0不同程度的错误
    2用法不当
    126不是可执行的
    127命令未找到
    1. [root@localhost1 array]#vim returntest.sh
    2. #!/bin/bash
    3. returntest1() {
    4. if [ $1 -eq $passwd ];then
    5. echo "$name的密码输入正确!"
    6. else
    7. echo "$name的密码输入错误!"
    8. return 1
    9. fi
    10. }
    11. name=张三
    12. passwd=123456
    13. returntest1 $1
    14. [root@localhost1 array]#bash returntest.sh 123
    15. 张三的密码输入错误!
    16. [root@localhost1 array]#echo $?
    17. 1 -- 这里输入错误返回了我们指定的状态码1
    18. [root@localhost1 array]#bash returntest.sh 123456
    19. 张三的密码输入正确!
    20. [root@localhost1 array]#echo $?
    21. 0

    六、函数的递归

            是指函数在满足递归条件的情况下,调用函数本身执行到

    1. [root@localhost1 ~]#vim jiecheng.sh
    2. #!/bin/bash
    3. fact() {
    4. if [ $1 -eq 0 -o $1 -eq 1 ];then
    5. echo 1
    6. else
    7. way=$[$1 - 1] #迭代方式(指定数每次减1)
    8. result=$(fact $way) #递归执行函数(使初始值每次减1)
    9. echo $[ $1 * $result ] #输出初始值乘每次递归的值,直到1(实现阶乘效果)
    10. fi
    11. }
    12. read -p "请输入一个数:" n
    13. result=$(fact $n)
    14. echo "$n的阶乘为:$result"
    15. [root@localhost1 ~]#bash jiecheng.sh
    16. 请输入一个数:6
    17. 6的阶乘为:720
    18. [root@localhost1 ~]#bash jiecheng.sh
    19. 请输入一个数:1
    20. 1的阶乘为:1
    21. [root@localhost1 ~]#bash jiecheng.sh
    22. 请输入一个数:4
    23. 4的阶乘为:24
    24. [root@localhost1 ~]#bash jiecheng.sh
    25. 请输入一个数:9
    26. 9的阶乘为:362880

    七、函数及其变量的作用范围

    1. 函数在shell脚本中仅在当前shell环境中有效
    2. shell脚本中变量默认全局有效
    3. 将变量限定在函数内部(定义变量前加上 local 命令)
    1. [root@localhost1 ~]#vim variable.sh
    2. #!/bin/bash
    3. #定义i变量值为1
    4. i=1
    5. test1() {
    6. i=10 #定义i变量值为10
    7. echo $i
    8. }
    9. test1 #调用函数
    10. echo $i #输出变量i的值
    11. #输出的i均为10,是由于第二点的特性,i的值在函数中被重新赋值了
    12. [root@localhost1 ~]#bash variable.sh
    13. 10
    14. 10

    使用 local 限定函数内部变量

    1. [root@localhost1 ~]#vim variable.sh
    2. #!/bin/bash
    3. i=1
    4. test1() {
    5. local i=10 #加local限定为内部变量,将不再影响函数外的变量
    6. echo $i
    7. }
    8. test1
    9. echo $i
    10. [root@localhost1 ~]#bash variable.sh
    11. 10
    12. 1

    八、外部脚本调用函数

            在外部脚本调用一个脚本或文件中的函数,需要先在脚本中加载目标文件,需要使用绝对路径(source 文件名 或 . 文件名),再输入函数名即可执行。

    1. [root@localhost1 ~]#vim hanshu.sh
    2. #!/bin/bash
    3. test1() {
    4. echo "我是hanshu.sh文件中的test1函数"
    5. }
    6. #在外部脚本中调用hanshu.sh中的test1函数
    7. [root@localhost1 ~]#vim diaoyong.sh
    8. source /root/hanshu.sh
    9. test1
    10. #执行外部脚本
    11. [root@localhost1 ~]#bash diaoyong.sh
    12. 我是hanshu.sh文件中的test1函数

    调用函数库文件

            函数库文件是指将一些常用的函数提前编写好放入这个函数库文件,当我们编写脚本时,同样通过绝对路径加载函数库文件,在调用其中的函数,这样可以提高代码编写的效率(类似于java中面向对象编程,调用方法)

  • 相关阅读:
    @AutoConfigurationPackage注解类
    MacOS怎么安装Nacos(附带:Windows系统)
    JavaScript数组的扁平化:将 2D JavaScript 二维数组转换为 1D 一维数组(多种方法)
    Spring AOP以及统一处理
    MySQL——事务和视图
    微服务之Eureka
    二、集成学习:Boosting 之 AdaBoost_分类问题
    移动端页面秒开优化总结
    Vue学习(9月3号)
    设计模式学习笔记 - 开源实战四(中):剖析Spring框架中用来支持扩展的设计模式
  • 原文地址:https://blog.csdn.net/weixin_58544496/article/details/126630056