点击返回 自学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

...

自学Linux Shell16.3-函数递归+创建库的更多相关文章

  1. 自学Linux Shell16.4-在命令行上使用函数

    点击返回 自学Linux命令行与Shell脚本之路 16.4-在命令行上使用函数 脚本函数不仅可以用作shell脚本命令,也可以用作命令行界面的命令.一旦在shell中定义了函数,可以从系统的任意目录 ...

  2. 自学Linux Shell16.1-函数概念

    点击返回 自学Linux命令行与Shell脚本之路 16.1-函数概念 编写比较复杂的shell脚本时,完成具体任务的代码可能需要重复使用.bash shell提供满足这种要求的特性.函数是被赋予名称 ...

  3. 自学Linux Shell16.2-函数中使用变量

    点击返回 自学Linux命令行与Shell脚本之路 16.2-函数中使用变量 1. 向函数传递参数 函数可以使用标准参数环境变量来表示命令行传递给函数的参数.例如,     函数名在变量$0中定义,函 ...

  4. 自学Linux命令行与Shell脚本之路

    自学Linux命令行与Shell脚本之路[第一回]:初识Linux   1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3  ...

  5. 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用

    原文出处: 吴秦的博客    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...

  6. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

  7. linux进程编程:子进程创建及执行函数简介

    linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system();    下面分别做详细介绍.(1)fork()    函数定 ...

  8. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  9. 利用php函数mkdir递归创建层级目录

    项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...

随机推荐

  1. Luogu4609 FJOI2016 建筑师 第一类斯特林数

    题目传送门 题意:给出$N$个高度从$1$到$N$的建筑,问有多少种从左往右摆放这些建筑的方法,使得从左往右看能看到$A$个建筑,从右往左看能看到$B$个建筑.$N \leq 5 \times 10^ ...

  2. 记一次MongoDB裸奔

    导言 大意失荆州,裸奔的 MongoDB 被黑了.虽然并不是什么非常重要的数据,但也给自己敲响的一个警钟.虽然我们平时不容易接触到数据安全,但我们在开发,部署项目的时候,一定要养成良好的安全意识. 根 ...

  3. 调用不同目录类的protected构造器

    一.问题 二.分析 调用不同目录类的protected构造器,IDE报错. 二.解决办法: 后面添加一个{}就可以了

  4. ML.NET 示例:开篇

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  5. Visual Studio2017 数据库架构比较

    一.前言 开发的时候在测试服务器上和线网服务器上面都有我们的数据库,当我们在线网上面修改或者新增一些字段后,线网的数据库也需要更新,这个时候根据表的修改记录,然后在线网上面一个一个增加修改很浪费效率而 ...

  6. YouTube视频下载的12个软件(Win和Mac)

    如今,观看视频已经成为人们生活中重要的一部分.很多时候,我们都需要用到视频,比如教育用途.会议报告.休闲娱乐以及广告宣传等.如果你觉得有时候资源不好找的话,不放去看下YouTube.YouTube是世 ...

  7. 金蝶PDA金蝶盘点机金蝶仓库条码管理方案-采购入库单教程

    采购入库单有两种做法: 第一种:按照采购订单下推的采购入库单. 第二种:直接新增采购入库单,也就是不按照采购订单下推. 按照采购订单下推生成采购入库单,会以采购订单的商品品种和数量作为应收.扫描条码入 ...

  8. Centos7系统下修改主机名操作笔记

    习惯了在Centos6系统下修改主机名的操作,但是Centos7下修改主机名的操作却大不相同!操作笔记如下: 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient) ...

  9. ansible环境部署及常用模块总结 - 运维笔记

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  10. ul ol li的序号编号样式

    序号样式例子,下面是html代码(做参考) <ol> <li>列表内容列表内容列表内容列表</li> <li>列表内容列表内容列表内容列表</li ...