格式:

func() {
    command
}

function 关键字可写,也可不写。

#!/bin/bash 
func() {
    echo "This is a function."
}
func
# bash test.sh
This is a function.

Shell 函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号。

#!/bin/bash 
func() {
    VAR=$((1+1))
    return $VAR
    echo "This is a function."
}
func 
echo $?
# bash test.sh
2

return 在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit。

#!/bin/bash 
func() {
    echo "Hello $1"
}
func world
# bash test.sh 
Hello world

通过 Shell 位置参数给函数传参。
函数也支持递归调用,也就是自己调用自己。

#!/bin/bash 
test() {
    echo $1 
    sleep 1 
    test hello
}
test

执行会一直在调用本身打印 hello,这就形成了闭环。
像经典的 fork 炸弹就是函数递归调用:

:(){ 
    :|:& 
    };
: 或 .(){
    .|.&
    };.

这样看起来不好理解,我们更改下格式:

:() {
:|:&
};
:

再易读一点:

bomb() 
{ 
    bomb|bom
    b&
};
bomb

分析下:
:(){ } 定义一个函数,函数名是冒号。
: 调用自身函数
| 管道符
: 再一次递归调用自身函数
:|: 表示每次调用函数":"的时候就会生成两份拷贝。
& 放到后台
; 分号是继续执行下一个命令,可以理解为换行。
: 最后一个冒号是调用函数。
因此不断生成新进程,直到系统资源崩溃。
一般递归函数用的也少,了解下即可!