目录
一.函数概述
1.作用
- 使用函数可以避免代码重复
- 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
2.定义
2.1.格式1
function 函数名 {
命令序列
}
2.2.格式2
函数名() {
命令序列
}
二.函数返回值
- return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
1.使用原则
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
- 退出状态码必须是0~255,超出时值将为除以256取余
2.示例
2.1.
function db1 {
read -p "请输入:" value
return $[$value * 2]
}
db1
echo $?
2.2.
db1() {
read -p "请输入:" value
echo $[$value * 2]
}
result=`db1`
echo $result
三.函数传参
1.格式1
sum1() {
sum=$[$1 + $2]
echo $sum
}
read -p "输入第一个参数:" first
read -p "输入第二个参数:" second
sum1 $first $second
2.格式2
sum2() {
sum=$[$1 + $2]
echo $sum
}
sum2 $1 $2
3.实操
题目:使用函数输出菱形,并实现可通过输入数值的大小来伸缩菱形的大小
#!/bin/bash
#题目:使用函数输出菱形,并实现可通过输入数值的大小来伸缩菱形的大小
#菱形
lingxing() {
num=$1
for ((a=1; a<=num; a++))
do
for ((i=num; i>a; i--))
do
echo -n " "
done
c=$[(a*2)-1]
for ((b=1; b<=c; b++))
do
echo -n "*"
done
echo ""
done
for ((a=num-1; a>=1; a--))
do
#输出空格正三角
for ((b=num; b>a; b--))
do
echo -n " "
done
#输出倒等腰三角
c=$[(a*2)-1]
for ((i=1; i<=c; i++))
do
echo -n "*"
done
echo ""
done
}
######### main #########
read -p "请输入大小数值:" NUM
lingxing $NUM
四.函数变量的作用范围
- 函数在Shell脚本中仅在当前Shell环境中有效
- Shell脚本中变量默认全局有效
- 将变量限定在函数内部使用local命令
myfun() {
local i
i=8
echo $i
}
i=9
myfun
echo $i
五.递归函数
- 函数调用自己本身的函数
示例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
示例2:递归目录
#!/bin/bash
#递归目录
dgdir() {
for i in $(ls $1)
do
dir=$1
if [ -d $dir/$i ];then
echo -e "$2$i 为目录"
dgdir $dir/$i "\t$2"
else
echo -e "$2$i 为文件"
fi
done
}
######## main #########
read -p "请用绝对路径输入你要递归查看的目录名:" folder
dgdir $fold
六.函数库
- 可以事先创建一个函数库,在里面定义各种常用的函数然后可以在别的shell脚本中直接引用
1.创建函数库
vim myfuncs.sh
jiafa() {
echo $[$1 + $2]
}
chengfa() {
echo $[$1 * $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "$2不能为0"
fi
}
2.在脚本中加载函数库文件
vim test.sh
. myfuncs.sh
value1=10
value2=5
result1=`jiafa $value1 $value2`
result2=`chengfa $value1 $value2`
result3=`chufa $value1 $value2`
echo "加法结果为:$result1"
echo "乘法结果为:$result2"
echo "除法结果为:$result3"