一、函数概念及格式
1、函数的概念
函数定义:封装的可重复利用的具有特定功能的代码
函数就是可以在shell脚本当中做出一个类似自定义执行的命令的东西,最大的功能就是简化我们很多的代码。
- 将命令序列按照格式书写在一起
- 可方便重复使用命令序列
2、函数的格式
2.1格式一
[function] 函数名 (){ 命令序列 [return x] #使用return或者exit可以显式的结束函数 }
2.2格式二
函数名(){ 命令序列 }
二、函数的返回值
1、return的作用
返回函数结果
语法为:return+表达式
语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果。return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值, 由return后面的参数指定。return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误!当执行return语句时,即使函数主体中还有其他语句,函数执行也会停止!
使用原则:
函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
退出状态码必须是0~255,超出时值将为除以256取余
2、实例操作一:return返回值
2.1格式
#!/bin/bash function test1 { read -p "请输入一个值:" value return $[$value * 2] } test1 #调用函数 echo $?
三、函数传参
函数也是有参数的,它的内置变量与shell脚本很类似,函数名称代表示$0,而后续的变量也是以$1、$2…来替换的
1、实例操作一
1.1格式
#!/bin/bash sum() { echo "第一个位置参数为$1" echo "第二个位置参数为$2" sum1=`echo "$s1+$s2" | bc` echo $sum1 } read -p "请输入第一个参数:" num1 read -p "请输入第二个参数:" num2 sum $num1 $num2
1.2输出结果
四、函数变量的作用范围
1、概念
函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
2、实例操作
2.1格式
#!/bin/bash func () { local i=10 echo $i } func echo $i
2.2输出结果
五、函数的递归
函数调用自己本身的函数
1、函数的递归应用:阶乘
阶乘(factorial)是基斯顿·卡曼(Christian Kramp, 1760 – 1826)于1808年发明的运算符号。
阶乘,也是数学里的一种术语。
阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。 例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。
在表达阶乘时,就使用“!”来表示。如h阶乘,就表示为h!
阶乘一般很难计算,因为积都很大
1.1格式
#!/bin/bash fact () { if [ $1 -eq 1 ] then echo 1 else local tmp=$[$1-1] local res=$(fact $tmp) echo $[$1 * $res] fi } read -p "请输入计算阶乘的数字:" num res=$(fact $num) echo $res
1.2操作
六、创建函数库
1、创建函数库格式
#!/bin/bash fact () { if [ $1 -eq 1 ];then echo 1 else local temp=$[$1 - 1] local result=$(fact $temp) echo $[$1 * $result] fi } addition () { echo $[$1 + $2] } subtraction () { echo $[$1 - $2] } multiplication () { echo $[$1 * $2] } division () { if [ $2 -ne 0 ];then echo $[$1 / $2] else echo "被除数不能为0" fi }
2、调用函数脚本格式
. /root/demoq9.sh value1=$1 value2=$2 result1=$(addition $value1 $value2) result2=$(subtraction $value1 $value2) result3=$(multiplication $value1 $value2) result4=$(division $value1 $value2) result5=$(fact $value1) echo "加法的结果为 $result1" echo "减法的结果为 $result2" echo "乘法的结果为 $result3" echo "除法的结果为 $result4" echo "$value1的阶乘结果为 $result5"