一、我对函数的理解就是:

编写shell脚本时,你经常会发现在多个地方使用了同一段代码。如果只是一小段代码,一般也无关紧要。但是要在shell脚本中多次重写大块代码段,那就太累人了。bash shell提供的用户自定义函数功能就可以解决这个问题。

二、创建函数的四种方法:前三种是在脚本中创建,第四种是在命令行创建。

第一种、

function name () {
    commands;
}

第二种、

function name {
    commands;
}

第三种

name () {
    commands;
}

第四种、在命令行创建函数 

$ function divem { echo $[ $1 / $2 ]; }
$ divem 100 5
20

这个例子是实现两个参数的除法运算。

三、调用函数

调用函数的方法非常简单,直接调用函数名就可以了

eg:

#!/bin/bash
name (){
    echo "hello,word!"
}

name

执行一下脚本,就会输出:hello,word!

四、向函数传递参数

1、我们可以向函数中传递变量,必须将参数和函数放在同一行,函数名与参数之间要有一个空格。如需传递多个参数,参数与参数之间要有一个空格。

eg:

#!/bin/bash
name (){
echo $1
echo $2
}

name 4 7

输出的结果是:

4

7

2、我们甚至还可以向函数传递一个数组!

eg:

function ss(){
        sss=(`echo "$*"`)
        echo ${sss[*]}
}
array=(1 2 3 4 5)
ss ${array[*]}

输出的结果是:1 2 3 4 5

五、函数的递归调用

我们在脚本中创建的函数默认属于本地函数,本地函数中的变量如果不加特殊声明,就是局部函数变量。局部函数变量的一个特性是自成体系。除了从脚本命令处获得的变量,自成体系的函数不需要使用任何的外部资源。而这个特性也使得函数可以递归调用。下面给出两个经典的例子:

1、阶乘函数

vim jiecheng.sh
#!/bin/bash
    fac(){
           if [ $1 -eq 1 ];then
                  echo 1
   
           else
                 temp=$[ $1 - 1 ]
                   result=$(fac $temp)
                  echo $[ $result * $1 ]
         fi
  }
  read -p "请输入一个整数:" value
  result=$(fac $value)
  echo "The facto of $value is:$result"

[root@localhost zuoye]# ./jiecheng.sh 
请输入一个整数:4
The facto of 4 is:24

2、斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)

vim fbnsl.sh
#!/bin/bash
func(){
f[0]=0
f[1]=1
        if [ $1 -gt 1 ];then
        for n in `seq 2 $1`;do
                let f[$n]=${f[$[$n-1]]}+${f[$[$n-2]]};
        done
        fi
echo ${f[$1]}
echo ${f[*]}
return 0;
}
func $1

[root@localhost zuoye]# ./fbnsl.sh 4
3
0 1 1 2 3