自学Linux Shell16.3-函数递归+创建库
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-函数递归+创建库的更多相关文章
- 自学Linux Shell16.4-在命令行上使用函数
点击返回 自学Linux命令行与Shell脚本之路 16.4-在命令行上使用函数 脚本函数不仅可以用作shell脚本命令,也可以用作命令行界面的命令.一旦在shell中定义了函数,可以从系统的任意目录 ...
- 自学Linux Shell16.1-函数概念
点击返回 自学Linux命令行与Shell脚本之路 16.1-函数概念 编写比较复杂的shell脚本时,完成具体任务的代码可能需要重复使用.bash shell提供满足这种要求的特性.函数是被赋予名称 ...
- 自学Linux Shell16.2-函数中使用变量
点击返回 自学Linux命令行与Shell脚本之路 16.2-函数中使用变量 1. 向函数传递参数 函数可以使用标准参数环境变量来表示命令行传递给函数的参数.例如, 函数名在变量$0中定义,函 ...
- 自学Linux命令行与Shell脚本之路
自学Linux命令行与Shell脚本之路[第一回]:初识Linux 1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3 ...
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
原文出处: 吴秦的博客 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...
- [笔记]linux下和windows下的 创建线程函数
linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...
- linux进程编程:子进程创建及执行函数简介
linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system(); 下面分别做详细介绍.(1)fork() 函数定 ...
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- 利用php函数mkdir递归创建层级目录
项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...
随机推荐
- 在平衡树的海洋中畅游(三)——Splay
Preface 由于我怕学习了Splay之后不直接写blog第二天就忘了,所以强行加了一波优先级. 论谁是天下最秀平衡树,我Splay第一个不服.维护平衡只靠旋转. 一言不合转死你 由于平衡树我也介绍 ...
- zjoi2018 day1游记
咕咕咕 upd:看见有人贴上zhihu的问题,那个我早就看到了... 谴责一番题主 @gzy_cjoier 阅读量马上700没想到吧 既然这么火我挂个广告吧 永别,OI 听说有人催更??
- [JDBC]你真的会正确关闭connection吗?
Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = DriverManag ...
- TCP 三次握手原理,你真的理解吗?
最近,阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么观察他们的指标说清楚. 因此,蛰剑写下这篇文章 ...
- 【亲测有效】无法定位链接器!请检查 tools\link.ini 中的配置是否正确的解决方案
在进行易语言静态编译的时候,出现了如下错误: 正在进行名称连接...正在统计需要编译的子程序正在编译...正在生成主程序入口代码程序代码编译成功等待用户输入欲编译到的文件名正在进行名称连接...开始静 ...
- C_数据结构_递归自己调用自己
# include <stdio.h> void f(int n) { ) printf("哈哈\n"); else f(n-i); } int main(void) ...
- 运行scrapy crawl (文件名)时显示invalid syntax和no modle 'win32api'解决方案
使用pycharm爬取知乎网站的时候,在terminal端输入scarpy crawl zhihu,提示语法错误,如下: 原因是python3.7中将async设为关键字,根据错误提示,找到manho ...
- eclipse新建maven项目,修改默认jdk版本
我们新建maven项目,默认jdk版本是1.5,我们可以修改成我们想要的版本,有两种方法 1每个项目修改,在pom.xml添加 <build> <plugins> <!- ...
- 在XShell中使用sz和rz命令下载和上传文件
借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器 工具/原料 XShell CentOS 6.5 使用sz下载文件 1 输 ...
- FZU软工实践–团队成员交换交接情况
0.前言 本次交接主要是为了之后Beta冲刺工作可以更加顺利而进行的.因为我跟其他队友交互不够方便,而且我们项目当前比较缺做前端的人员,后端功能已基本实现.所以我换出来了.希望大家可以顺顺利利做完一步 ...