zoukankan      html  css  js  c++  java
  • 自学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

     

    ...

  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/yaoyaojcy/p/9262316.html
Copyright © 2011-2022 走看看