shell函数
Shell函数的概述
将命令序列按格式写在一起
方便重复使用命令序列
Shell函数定义
shell函数定义有两种方法:
function 函数名 {
命令序列
return x 使用return或exit可以显式地结束函数
}
函数名 () {
命令序列
}
调用函数的方法
函数名 参数1 参数2
实验操作
编写yum源仓库脚本文件
函数返回值
return
表示退出函数并返回一个退出值,脚本中可以用 $ ?
变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?
变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255
,超出时值将为除以256
取余
操作命令
function 函数名 {
read -p "请输入: "aa
return $[$aa * 2]
}
函数名(进行调用)
echo $?
函数名() {
read -P "请输入:”aa
echo $[$aa * 2]
}
result-“函数名”
echo $result
实验操作
一、命令一操作
编写一个函数脚本
输入数字取返回码
这里可以看到返回值不是输入的数乘以2了,因为返回值的范围是0~255,超过时需要除以256取余,200*2/256取余剩下就是144
我们添加一条命令进行查看
可以看到返回值为0。以为$ ?只返回最后一条执行命令的退出状态码,最后一条执行的是ls,所以返回值为0。因此执行函数结束立即取返回值。
二、命令二操作
继续上一个操作继续操作
可以看到下面的操作值2输入200的返回码是400,并没有取余,以为echo不限制,第一个使用的return,第二个使用的是echo
函数传参
当某个函数定义好了以后,用户可以通过函数名来调用该函数
可以看到定义的函数变量值被调用输出
还有显示的数值是看你函数调用来依据的,例如:
可以看到,我们输入第一个位置变量值是10,第二个是20,但是输出的第一个变量值却是20,因为我们使用函数名先调用的$2,所以第一个变量值是20
这就是函数传参使用函数名调用定义的函数 |
函数变量的作用范围
函数在Shell脚本中仅在当前She11环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
操作命令
myfun() {
local i
i=8
echo $i
}
i-9
myfun
echo $i
实验操作
这里输出的是8、8,定义一个数调用输出,先在函数内执行一遍,然后函数外输出一遍
输出的还是8、8,因为它调用的只是函数内的值,9并不是函数内定义的值,所以输出的还是8、8
这是时候执行是8、9,因为i=9是在函数外部定义的,默认全局有效
这里添加一个echo,执行输出结果是9、8、8,因为函数先调用的9然后echo输出,函数内定义i=8,输出8,最后echo输出上一条定义的结果
这里添加一个local,最后输出结果是9、8、9,因为函数先调用i=9输出出来,因为函数内部加了个local,使i=8这个变量值限定在函数内部,所以最后echo输出的是9而不是8
递归
函数调用自己本身的函数,一路到底,一层一层进行执行,一直到底
操作命令
#阶乘 5!(5*4*3*2*1)
fact ( ) {
if[ $ 1-eq 1]
then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
echo $[$1 * $result]
#5*$result (4*$result (3*$result (2*$result(1))) )
fi
}
read -p "请输入: "n
result=$(fact $n)
echo $result
5!
fact 5 $1=5 temp=4 result=fact 4 echo 5* fact 4 5*4*3*2*1
fact 4 $1=4 temp=3 result=fact 3 echo 4* fact 3 4*3*2*1
fact 3 $1=3 temp=2 result-fact 2 echo 3* fact 2 3*2*1
fact 2 $1=2 temp=1 result-fact 1 echo 2* fact 1 2*1
fact 1 $1=1 echo 1
实验操作
这就是使用函数递归一层层计算出最后的值
递归目录
创建函数库
创建加减乘除和阶乘函数库cxy7.sh
调用前面创建的函数库cxy7.sh
可以算出加减乘除和阶乘算出的结果