目录
一、Shell函数
1.shell函数的概括
Shell函数的优点
- 可以避免代码重复
- 可以将大的工程分割为若干小的功能模块,代码的可读性更强
Shell函数的定义
#函数定义1
function 函数名 {
命令序列
}
#函数定义2
函数名() {
命令序列
}
##### main #######
#可以在主代码区域中直接使用函数名调用函数
函数名
Shell函数的返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余
如何获取函数返回值?
方法1 只能返回0-255之间的数值,超出部分为除以256取余数
[root@localhost ~]# vim 1.sh
#!/bin/bash
db2() {
read -p "请输入一个整数:" num
sum=$[$num * 2]
return $sum
}
####### main #######
db2
echo "$?"
[root@localhost ~]# chmod +x 1.sh
[root@localhost ~]# bash 1.sh
请输入一个整数:300
88
[root@localhost ~]# vim 1.sh
[root@localhost ~]# bash 1.sh
请输入一个整数:180
104
[root@localhost ~]# bash 1.sh
请输入一个整数:100
200
方法2
[root@localhost ~]# vim 1.sh
#!/bin/bash
db2() {
read -p "请输入一个整数:" num
sum=$[$num * 2]
echo $sum
}
####### main #######
result=$(db2)
echo $result
[root@localhost ~]# bash 1.sh
请输入一个整数:20
40
[root@localhost ~]# bash 1.sh
请输入一个整数:200
400
[root@localhost ~]# bash 1.sh
请输入一个整数:300
600
函数传参
通过在 调用函数时,后面跟位置参数;在函数体里使用 $1 $2 来引用函数后面跟的位置参数
函数体里面的 $1$2 代表的是调用函数时,函数名后面跟的 第一个 第二个 位置参数
[root@localhost ~]# vim 2.sh
[root@localhost ~]# chmod +x 2.sh
[root@localhost ~]# bash 2.sh
输入第一个参数:10
输入第二个参数:25
10 + 25 的和为 35
[root@localhost ~]# vim 2.sh
#!/bin/bash
db1() {
sum=$[$1 + $2]
echo $sum
}
##### main #######
read -p "输入第一个参数:" num1
read -p "输入第二个参数:" num2
sum1=$(db1 num1 num2)
echo "$num1 + $num2 的和为 $sum1"
Shell函数变量的作用范围
函数默认只能在脚本内的shell环境有效
脚本中的变量默认全局有效(即函数体内外部有效)
在函数体内执行 local 变量,可将变量限定在函数体内部使用
[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
8
[root@localhost ~]# vim 3.sh
#!/bin/bash
i=3
i=8
echo $i
#输出8,因为i的值被覆盖了
[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
8
[root@localhost ~]# vim 3.sh
#!/bin/bash
myfun() {
i=3
}
####### main #######
myfun
i=8
echo $i
#主函数开始运行,第一步函数调用i=3,然后i=8覆盖后输出
[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
2
3
[root@localhost ~]# vim 3.sh
#!/bin/bash
myfun() {
i=2
echo $i
}
########## main ###########
myfun
i=3
echo $i
#调用函数时输出函数里面i=2,而后输出的i被i=3覆盖
[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
3
7
[root@localhost ~]# vim 3.sh
#!/bin/bash
myfun() {
local i
#local定义的变量只能在local之后到函数结束前有效
i=3
echo $i
}
########## main ###########
i=7
myfun
echo $i
#local限定了函数i的值,函数外不能重新覆盖,而没有local的变量时全局有效的
二、函数的递归
函数调用自己本身的函数
实例1 阶乘
[root@localhost ~]# vim 4.sh
[root@localhost ~]# chmod +x 4.sh
[root@localhost ~]# bash 4.sh
请输入求阶乘的数值:1
1阶乘的值为1
[root@localhost ~]# bash 4.sh
请输入求阶乘的数值:10
10阶乘的值为3628800
[root@localhost ~]# vim 4.sh
#!/bin/bash
#递归求介绍
fact() {
if [ $1 -eq 1 ];then
echo 1
else
tmp=$[$1 - 1]
result=$(fact $tmp)
echo $[$1 * $result]
fi
}
read -p "请输入求阶乘的数值:" num
res=$(fact $num)
echo "$num阶乘的值为$res"
示例2:递归目录
#!/bin/bash
#递归目录
dgdir() {
for i in $(ls $1)
do
if [ -d $1/$i ];then
echo -e "$2$i 为目录"
dgdir $1/$i "\t$2"
else
echo -e "$2$i 为文件"
fi
done
}
######## main ########
read -p "请用绝对路径输入你要递归查看的目录名:" folder
dgdir $folder ""
三、函数库文件
以将经常使用的函数存入一个单独的函数文件,然后将函数文件载入shell,再进行调用函数.
1.准备函数库
[root@localhost ~]# cd /opt
[root@localhost opt]# vim 1.sh
jiafa() {
echo $[$1 + $2]
}
jianfa() {
echo $[$1 - $2]
}
chengfa() {
echo $[$1 * $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo "除数不能为0"
else
echo $[$1 % $2]
fi
}
fact() {
if [ $1 -eq 1 ];then
echo 1
else
temp=$[$1-1]
result=$(fact $temp)
echo $[$1 * $result]
fi
}
2.在脚本中加载函数库文件 一定要在脚本中加载函数库,用source或者点(.)
[root@localhost ~]# vim 6.sh
#!/bin/bash
source /opt/1.sh
value1=$1
value2=$2
res1=$(jiafa $value1 $value2)
res2=$(jianfa $value1 $value2)
res3=$(chengfa $value1 $value2)
res4=$(chufa $value1 $value2)
res5=$(fact $value1 $value2)
echo "加法的结果为$res1"
echo "减法的结果为$res2"
echo "乘法的结果为$res3"
echo "除法的结果为$res4"
echo "阶乘的结果为$res5"