作为 Linux/Unix 系统上内核与用户之间的接口,shell 由于使用方便、可交互能力强、具有强大的编程能力等特性而受到广泛的应用。bash(Bourne Again shell)是对 Bourne shell 的扩展,并且综合了很多 csh 和 Korn Shell 中的优点,使得 bash 具有非常灵活且强大的编程接口,同时又有很友好的用户界面。bash 所提供的诸如命令补齐、通配符、命令历史记录、别名之类的新特性,使其迅速成为很多用户的首选。
然而,作为一种 解释性语言,bash 在编程能力方面提供的支持并不像其他编译性的语言(例如 C 语言)那样完善,执行效率也会低很多,这些缺点在编写函数(尤其是递归函数)时都展现的一览无余。本文将从经典的 fork 炸弹入手,逐一介绍在 bash 中编写递归函数时需要注意问题,并探讨各种问题的解决方案。
尽管本文是以 bash 为例介绍相关概念,但是类似的思想基本上也适用于其他 shell。
函 数在程序设计中是一个非常重要的概念,它可以将程序划分成一个个功能相对独立的代码块,使代码的模块化更好,结构更加清晰,并可以有效地减少程序的代码 量。递归函数更是充分提现了这些优点,通过在函数定义中调用自身,可以将复杂的计算问题变成一个简单的迭代算法,当回溯到边界条件时,再逐层返回上一层函 数。有很多数学问题都非常适合于采用递归的思想来设计程序求解,例如阶乘、汉诺(hanoi)塔等。
可能很多人都曾经听说过 fork 炸弹,它实际上只是一个非常简单的递归程序&#