内容概要
- 一、Shell函数介绍
- 二、Shell函数格式
- 函数返回值
- 函数传参
- 函数变量的作用范围
- 递归阶乘
- 递归目录
- 创建函数库
一、Shell函数介绍
在我们编写Shell脚本的时候,经常会发现在多个地方使用了同一段代码。如果只是一小段代码也无关紧要,但是如果多次重写大的代码块就累人了。bash shell提供了函数这个功能。可以将我们的Shell 脚本封装起来,这样就能在脚本中的任何地方多次使用它了。
函数是一个脚本代码块,你可以为其命名并在代码中任何位置使用,需要在脚本中使用该代码块时,只要调用所起的函数名就行了。
二、Shell函数格式
格式1:
function 函数名{
命令序列
[return x]
}
格式2:
函数名(){
命令序列
[return x]
}
函数返回值
1、return 表示退出函数并返回一个退出值,脚本中可以使用$? 变量显示该值。
2、使用规则:
(1)、函数已结束就取返回值,因为$? 变量只返回执行的最后一条命令的退出状态码。
(2)、退出状态码必须是0~255,超出时值将除以256取余。
函数传参
sum () {
sum=$[$1+$2]
echo $sum
}
read -p “输入第一个参数:” s1
read -p “输入第二个参数:” s2
sum1 $s1 $s2
函数变量的作用范围
函数在Shell脚本中仅在当前的Shell 环境中有效。
Shell 脚本中变量默认全局有效。
可以使用local 命令将变量限定在函数内。
fun () {
local i
i=8
echo $i
}
i=5
fun
echo $i
递归阶乘
递归函数其实就是自己调用自己
#!/bin/bash
i=1
fact() {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
echo $[$1 * $result]
fi
}
read -p "请输入:" n
result=$(fact $n)
echo "$n的阶乘为:$result"
递归目录
#!/bin/bash
function myfun () {
for f in $1/*
do
if [ -d $f ];then
echo "$2$f" #如果是目录就输出这个目录,$2为空格是用于区分父子目录
myfun "$f" " $2"
else
if [ -x $f ];then
echo "$2$f"
fi
fi
done
}
OLDIFS=$IFS
IFS=$IFS:
myfun "/root"
IFS=$OLDIFS
创建函数库
[root@localhost /opt/test#]vim myfuncs.sh
#!/bin/bash
jiafa() {
echo $[$1 + $2]
}
chengfa() {
echo $[$1 * $2]
}
jianfa() {
echo $[$1 - $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "$2不能为0"
fi
}
[root@localhost /opt/test#]vim fun7.sh
. /opt/test/myfuncs.sh ##调用函数库,路径要写对
read -p "请输入第一个数:" value1
read -p "请输入第二个数:" value2
result1=`jiafa $value1 $value2`
result2=`jianfa $value1 $value2`
result3=`chengfa $value1 $value2`
result4=`chufa $value1 $value2`
echo "加法:$result1"
echo "减法:$result2"
echo "乘法:$result3"
echo "除法:$result4"