- 上一篇函数的基本的概念,使用,本篇介绍,函数调用的几种方式
使用return命令
- 如果在函数使用内置命令,return,则函数执行到带有return的语句时结束
- 如果return带有一个数值型的参数,则这个参数就是函数的 返回值,最大255
- 函数返回值就是函数体内最后执行一个执行的命令的返回状态
来看一个return的脚本:
检查某个进程号是否运行:
checkpid () {
#定义本地变量
local i
#使用for循环遍历传递给此函数的所有参数
for i in $*
do
[ -d "/proc/$i" ] && return 0
done
#返回1
return 1
}
此函数的功能就是检查某个进程号是否存在,存在返回0 ,不存在返回1
- 在函数中不适用return语句的情况下,除非发生语法 错误或者一个同名并且为只读的函数已经存在,函数默认的返回值 是0
函数返回值测试
- 利用特殊参数$? 判断最后一次执行的前台命令的退出状态
#调用函数
checkpid $pid1 $pid2 $pid3
if [ $? = 0 ] ;then
echo "the one of them is running ."
else
echo "these PIDs are not running ."
fi
也可以使用if语句测试函数返回值
if ( checkpid $pid1 $pid2 $pid3) ;then
echo "the one of them is running ."
else
echo "these PIDs are not running ."
fi
函数的调用
1.在shell命令行调用函数
- 直接输入函数的名字,就可以调用
2.在脚本中 调用函数
#定义一个函数
yday(){
#显示一天前的系统日期时间
date --date='1 day ago'
}
#调用函数
yday
- 要在脚本中调用函数,首先要创建函数,并确保它位于调用函数的语句之前。
- 因此,为了避免这种情况,要在脚本开头定义所有的函数和变量
3. 从函数中调用函数
- 可以把所有的函数存在一个函数文件中
- 把所有函数加载到当前脚本或是命令行
我们来写一个函数文件:
#!/bin/bash
# AUTHOR: Xie_qi_chao
# CREATED: 21/03/2019
# FILENAME:myfunction.sh
#定义函数
declare -r TRUE=0
declare -r FALSE=1
declare -r PASSWD_FILE=/etc/passwd
###############################################
# 用途:将字符串换为小写
# 参数: $1 -> 要转换未小写的字符串
###############################################
function ro_lower ()
{
#定义本地变量str
local str="$@"
#定义本地变量output
local output
#将变量str的值转换为小写后赋值给output
output=$(tr '[A-Z]' '[a-z]' <<< "${str}" )
echo $output
}
#################################################
# 用途:如果脚本由root用户执行则返回true
# 返回值:Ture或False
##############################################
function is_root () {
[ $(id -u) -eq 0 ] && return $TRUE || return $FALSE
}
##################################################
# 用途:如果应乎存在与文件/etc/passwd/则返回ture
# 参数:$1
#################################################
function is_user_exits {
local u="$1"
grep -q "^${u}" $PASSWD_FILE && return $TRUE || return $FALSE
}
- 执行脚本之后,就会将函数加载当前shell环境中
- 在脚本中执行刚刚的函数文件,就可以实现脚本调用函数
- 也可以使用 source 函数文件
4.递归函数调用
#!/bin/bash
#AUTHOR:Xie_qi_chao
#CREATED:21/03/2019
#FILENAME:fact.sh
#定义一个函数factorial———计算给定命令行参数的阶乘
factorial () {
local i=$1
local f
declare -i i
declare -i f
#factorial被调用直到$f 的值<=2
#开始递归
if [ "$1" -le 2 ] ;then
echo $i
else
f=$(( i - 1 ))
f=$(factorial $f)
f=$(( f * i ))
echo $f
fi
}
if [ "$#" -eq 0 ];then
echo "Usage: $0 number"
exit 1
fi
factorial $1
[root@xieqc shell]# sh fact.sh 10
3628800
函数放在后台使用
看一个脚本,磁带备份时可以显示一连串的小圆点,类似于进度条。
#!/bin/bash
#AUTHOR:Xie_qi_chao
#FILENAME:progressdots.sh
#CREATED:21/03/2019
progress ()
{
echo -n "$0 :Please wait ..."
while true
do
echo -n "."
sleep 5
done
}
dobackup ()
{
tar -zcvf /dev/st0 /home >/dev/null 2>&1
}
progress &
myself=$!
dobackup
kill $myself > /dev/null 2>&1
echo -n "...done"
echo
- 函数的优点
- 节省大量的时间
- 避免一次次地写重复地代码
- 更容易地编写程序
- 非常简单地维护程序