• 自学Linux Shell16.3-函数递归+创建库


    点击返回 自学Linux命令行与Shell脚本之路

    16.3-函数递归+创建库

    1. 函数递归

    • 递归调用函数是指函数调用自身进行求解。
    • 通常,递归函数有基值,函数最终递推到达该值。
    • 许多高级数学算法使用递归将复杂等式的递归层次反复降低,直到到达基值指定的层次。
    • 递归算法的一个经典示例是计算阶乘。一个数的阶乘是这个数乘以它前面的所有数的积。       

    比如计算5的阶乘:  5!=1*2*3*4*5=120
    使用递归的话,可以简化成:x!=x*(x-1)!    也就是x的阶乘等于x乘以x-1的阶乘

     1 #!/bin/bash
     2 function factorial {
     3    if [ $1 -eq 1 ]
     4    then
     5      echo 1
     6    else
     7      local temp=$[ $1 - 1 ]
     8      local result=$(factorial $temp)
     9      echo $[ $result*$1 ]
    10    fi
    11 }

    2. 创建库

    • 如果每个脚本都对相同的函数做出定义,且各个脚本对该函数只调用一次,那么上述函数和调用的做法看似没有减少重复代码。
    • bashshell可以创建函数的库文件,然后可以在不同脚本中引用改库文件。
    • 首先要创建公共库文件,包含多个脚本需要调用的函数。然后在用到这些函数的脚本文件中包含这个公共库文件。

    问题:

    在于shell函数的作用域。与环境变量一样,shell函数仅在其定义所处的shell会话中有效。如果从shell命令行界面运行myfuncs脚本,那么shell将打开一个新shell,并在该新shell中运行此脚本。这将为新shell定义了3个函数,但是试图运行调用这些库函数的另一脚本时,库函数并不能使用。

    解决办法:

    使用函数库的关键是source命令。source命令在当前shell环境中执行命令,而非创建新shell来执行命令。

    • 使用source命令在shell脚本内部运行库文件脚本。这样脚本可以使用这些函数
    • source有一个短小的别名,称为点操作符 
    • 为了在shell脚本中调用myfuncs库文件,只需添加下列命令行:    ../ myfuncs   或    source ./myfuncs 
    • 库文件和shell脚本建议在同一目录。如果不在同一目录,那么应当使用恰当的路径来访问库文件 
     1 #!/bin/bash
     2 function addem {
     3    echo $[ $1 + $2 ]
     4 }
     5 function multem {
     6    echo $[ $1 * $2 ]
     7 }
     8 function divem {
     9     if [ $2 -ne 0 ]
    10     then
    11     echo $[ $1 / $2 ]
    12     else
    13     echo -1
    14     fi
    15 }       # 定义了一个公共库, 里面有3个函数,addem函数两个数相加;multem函数两个数相乘;divem函数两个数相除

     

    3. 开源函数库shtool软件包介绍

     3.1 下载和安装shtool软件包

    下载地址:ftp://ftp.gnu.org/gnu/shtool/    最新为2008年的  shtool-2.0.8.tar.gz

     

    ...

  • 相关阅读:
    左眼右眼
    Mac 的“任务管理器” —— 活动监视器
    [分享] VIM 常用命令及游戏练级
    iOS 7 如何关闭已打开的应用(App)
    iPhone 如何设置彩信 ?
    JavaScript —— attachEvent 方法的使用
    习惯&感恩
    MySQL 基础 备份和恢复
    Python 数据结构 树
    Python 正在表达式
  • 原文地址:https://www.cnblogs.com/yaoyaojcy/p/9262316.html
Copyright © 2020-2023  润新知