简介
Bash(Bourne Again shell)也跟其他编程语言一样也支持函数,一般在编写大型脚本中需要用到,它可以将shell脚本程序划分成一个个功能相对独立的代码块,使代码的模块化更好,结构更加清晰,并可以有效地减少程序的代码量。但是bash作为一种解释性语言,bash 在编程能力方面提供的支持并不像其他编译性的语言(例如 C 语言)那样完善,执行效率也会低很多。
shell函数的定义、执行与传参
函数的定义
可以带function name()
定义,也可以直接name()
定义,不带任何参数。
格式1
1 | function name() { |
格式2
1 | name() { |
函数的执行
1 | name; |
传递参数
1 | !/bin/bash |
aa
和bb
定义的是全局变量。cc
和dd
定义的是局部变量,只能在函数name
中使用。$aa
是第一个参数$1
,$bb
是第一个参数$2
,以此类推$n
是第n
个参数$n
。return 0
参数返回,可以显示加:return
返回,如果不加,将以最后一条命令运行结果作为返回值。
递归函数
bash也支持递归函数(能够调用自身的函数)例如:1
2
3
4
5
6
7
8
9 !/bin/bash
function name() {
echo $1
name hello
sleep 1
}
name
运行此脚本后不断打印出hello,按Ctrl+C结束。
案例:递归经典–fork 炸弹
可能很多人都曾经听说过 fork 炸弹,它实际上只是一个非常简单的递归程序,程序所做的事情只有一样:这个递归函数能够调用自身,不算的生成新的进程,这会导致这个简单的程序迅速耗尽系统里面的所有资源,造成拒绝服务攻击。1
2
3
4
5
6.()
{
.|.&
}
;
.
- 第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。
- 第 2 行表示函数体开始。
- 第 3 行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。
- 第 4 行表示函数体结束。
- 第 5 行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。
- 第 6 行表示调用本函数。