shell函数
一、shell函数概述
1.函数的作用
函数是用来实现某些功能运算和完成各种特定操作的重要手段。
2.函数的优点
①允许标准组件式编程,提高了SQL语句的重用性、共享性和可移植性。
② 可以减少重复编写程序段的工作量,提高程序可读性。
③提高程序编译和运行效率,产生质量较高的目标代码,满足算法设计的“正确性、可读性、健壮性、效率与低存储量需求”的基本要求。
④能够实现较快的执行速度,能够减少网络流量
二、函数格式
函数格式一:
function 函数名 {
命令序列
}
函数格式二:
函数名() {
命令序列
}
调用函数格式一:直接调用
函数名
调用函数格式二:赋值再输出
result=`函数名`
echo "想要输出的结果"
三、函数返回值return
1.return概念及使用原则
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
(1)函数一结束就取返回值,因为 $?变量只返回执行的最后一条命令的退出状态码
(2)退出状态码必须是0~255,超出时值将为除以256取余
四、函数传参
1.函数传参概念
当某个函数定义好了以后,用户就可以通过函数名来调用该函数了。
(1)在定义方法时后面跟的参数就是形参,全称为"形式参数"
(2)在调用方法时后面跟的参数就是实参,全称为"实际参数"
五、函数变量作用范围
函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
ak () {
local i #设置局部变量
i=8
echo $i
}
i=9 #全局环境
ak
echo $i
#!/bin/bash
abc () {
local i #设置局部变量
i=8
echo $i
}
i=9 #全局环境
abc
echo $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 $result
2.递归目录
方法一
function list_files () {
for f in 'ls $1'
do
if [-d "$1/$f" ] ;then
echo "$2$f" #如果是目录就输出这个目录,$2为空格是用于区分父子目录
list_files "$1/$f" " $2"
else
echo "$2$f" #不是目录则输出$f结果
fi
done
}
list_files "/var/log" ""
方法二
#!/bin/bash
OLDIFS=$IFS
IFS=$IFS: #创建临时变量
for a in $PATH
do
echo "$a:"
f=`find $a -type f`
for b in $f
do
if [ -x $b ]
then
echo $b可执行
fi
done
done
IFS=$OLDIFS
七、创建库
建立库
vim functions.sh #不需要给权限
#!/bin/bash
jiafa() {
echo $[$1 + $2]
}
jianfa() {
echo $[$1 - $2]
}
chengfa() {
echo $[$1 * $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "$2不能为0"
fi
}
使用库
vim suanfa.sh #新建一个文件,直接调用函数库
. functions.sh
num1=10
num2=20
res1=`jiafa $num1 $num2`
res2=`jianfa $num1 $num2`
res3=`chengfa $num1 $num2`
res4=`chufa $num1 $num2`
echo "加法结果为:$res1"
echo "减法结果为:$res2"
echo "乘法结果为:$res3"
echo "除法结果为:$res4"
chmod +x suanfa.sh
./sunfa.sh