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

16.3-函数递归+创建库

1. 函数递归

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

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

 #!/bin/bash
function factorial {
if [ $ -eq 1 ]
then
echo
else
local temp=$[ $ - 1 ]
local result=$(factorial $temp)
echo $[ $result*$1 ]
fi
}

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脚本建议在同一目录。如果不在同一目录,那么应当使用恰当的路径来访问库文件 
 #!/bin/bash
function addem {
echo $[ $ + $ ]
}
function multem {
echo $[ $ * $ ]
}
function divem {
if [ $ -ne ]
then
echo $[ $ / $ ]
else
echo -
fi
} # 定义了一个公共库, 里面有3个函数,addem函数两个数相加;multem函数两个数相乘;divem函数两个数相除

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

3.1 下载和安装shtool软件包

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

...

最新文章

  1. ReactNative与NativeScript对比报告
  2. Ubuntu下Apache+SVN+submin实现WEB管理SVN
  3. jsonp跨域请求的问题
  4. NLog文章系列——如何配置NLog(转)
  5. Level2行情和传统行情的区别
  6. ibatis动态查询
  7. C++容器学习
  8. CSS3的box-sizing属性
  9. ps_cc切片
  10. [Haskell] 为什么列表操作++很昂贵?
  11. Definition of matrix norms
  12. centos7如何查询已运行服务?
  13. Python基础知识:if语句
  14. Python3+Dlib实现简单人脸识别案例
  15. 全球信息安全会议 Top 50
  16. 从0开始搭建Element项目
  17. 1349: Taking Pebbles (博弈 打表找规律)
  18. kafka集群及监控部署
  19. SPOJ 3267. D-query (主席树,查询区间有多少个不相同的数)
  20. ★ Maven的坑,tomcat插件6 不能与jdk8一起使用

热门文章

  1. BZOJ3451 Normal 期望、点分治、NTT
  2. Luogu4219 BJOI2014 大融合 LCT
  3. Http指南(3)
  4. Thrift_简介(基于C#)
  5. 没有 iOS 开发者账号的情况下部署到真机的方法
  6. 解密自动CPS变换
  7. Linux下"负载均衡+高可用"集群的考虑点 以及 高可用方案说明(Keepalive/Heartbeat)
  8. mysql 编码和汉字存储占用字节问题的探索
  9. NSCache的简单使用
  10. c#代码分析