一、我对函数的理解就是:
编写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