shell函数
一、shell函数
将命令序列按格式写在一起,这样可以方便我们平时重复使用命令序列
1.1 定义
两种定义方法
第一种
function 函数名 {
中间是命令序列
}
第二种
此方法使用较多
函数名(){
中间是命令序列
}
二、函数返回值
2.1 return
表示退出函数后会返回一个退出值,在脚本里我们用 “ $? ” 变量显示这个值
演示
使用原则
- 函数结束就取返回值,因为 “ $? ” 的变量只返回执行最后一条命令的退出状态码
- 退出状态码必须是0~255,超出时值将会是除以256取余
测试
cc () {
read -p "请输入一个数:" num
return $[$num*5]
}
cc
echo $? # 在echo前不能有多个命令,否则会导致脚本输出异常
66*5大于255,所以取余得出结果为74
2.2 echo
演示
cc1 () {
read -p "请输入第二个数:" aa
echo $[$aa*5]
}
cc11=$(cc1) # 将变量cc1赋予一个新的变量名
echo $[$cc11 *2] # echo再输出后再给新变量名命令
和return不同,echo直接输出这个变量数,并且在最后输出的时候还能再给其赋予其他命令
三、传参
3.1 在外部输入变量
cc () {
sum=$[$1 + $2] # 这里的1.2代表外部输入变量的第一位和第二位
echo $sum
}
cc $1 $2
3.2 可控参数输入
cc () {
sum=$[$1 + $2] # 这里的1.2代表函数名调用的第一个和第二个
echo $sum
}
read -p "输入第一个参数:" first # 给函数变量名
read -p "输入第二个参数:" second
cc $first $second # 这里输出的就是变量1和变量2,根据公式就是加法
可以自定义所需要输入的参数值
四、作用范围
函数变量的作用范围
函数在shell脚本中仅在当前的环境中有效
shell脚本中默认是全局有效的
cc () {
a=5 # 设置变量a
echo $a
}
a=10 # 在函数外设置
cc
echo $a
输出的结果依旧为函数内的a
我们可以使用 local 将a限定在这个函数内部,出了函数就会失效
cc () {
local a # 限定变量a
a=5
echo $a
}
a=10
cc
echo $a
六、递归
6.1 函数内的递归
函数调用自身的函数就是函数内的递归
6.2 阶乘递归
cc () {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[$1 - 1] # local限制变量只在函数内部
local result=$(cc $temp)
echo $[$1 * $result]
fi
}
read -p "请输入一个数:" a
result=$(cc $a)
echo $result
阶乘就是54321,每一次循环-1后和前面相乘
6.3 递归目录
function list_files {
for i in `ls $1`
do
if [ -d "$1/$i" ]
then
echo "$2$i"
list_files "$1/$i" "$2"
else
echo "$2$i"
fi
done
}
list_files "/var/log" ""
七、创建函数库
作用
可以把多个函数文件放进函数库内,调用库就可以使用这个函数库
7.1 创建库
库内可以放置你需要的脚本命令
jiafa() {
echo $[$1 + $2]
}
chengfa() {
echo $[$1 * $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "$2不能为0"
fi
}
7.2 使用
. hanshuku.sh # 调用函数库
read -p "请输入第一个数" a
read -p "请输入第二个数" b
result1=`jiafa $a $b`
result2=`chengfa $a $b`
result3=`chufa $a $b`
echo "加法结果为:" $result1
echo "乘法结果为:" $result2
echo "除法结果为:" $result3