目录
函数
一,什么是函数
二, 函数的返回值
三,函数语法
示例1:
示例2:
四,函数的调用
示例1:
示例2:
五,函数库文件
六, 递归函数
示例1:
示例2:
函数
一,什么是函数
1、把相同的程序段定义为函数,可以减少整个程序段代码量,提升开发效率。
2、增加程序段可读性、易读性,提升管理效率。
3、可以实现程序功能模块化,使得程序具备通用性(可移植性)。
二, 函数的返回值
首先,用户可以使用return语句来返回某个数值,这与绝大部分的程序设计语言是相同的。但是,在Shell中,return语句只能返回某个0~255之间的整数值。
在函数中,用户将需要返回的数据写入到标准输出(stdout),通常这个操作是使用echo语句来完成的。然后在调用程序中将函数的执行结果赋给一个变量。这种做法实际上就是命令替换的一个变种。
三,函数语法
function 函数名() {
指令
Return 返回函数的退出码:echo $?
}
简化写法1:
function 函数名 {
指令
return
}
简化写法2:
函数名() {
指令
return
}
示例1:
编写脚本文件定义函数并调用函数,执行脚本文件
1,使用 vim function_script.sh 命令打开脚本文件
[root@wangjingjing ~]# vim function_script.sh
2,在脚本文件中定义函数并调用函数
#使用三种不同的方法定义函数
function print_info1 () {
echo "This is func1"
return 111
}
function print_info2 {
echo "This is func2"
return 222
}
print_info3 () {
echo "This is func3"
return 333
}
#调用函数,并打印函数的返回值,直接是命令
print_info1
echo "$?"
print_info2
echo "$?"
print_info3
echo "$?"
3,使命命令 bash function_script.sh 执行脚本,结果如下:
[root@wangjingjing ~]# bash function_script.sh
This is func1
111
This is func2
222
This is func3
77
示例2:
在脚本refer_script.sh 中调用脚本 function_script.sh中的函数
1,使用命令 vim function_script.sh 打开脚本文件
[root@wangjingjing ~]# vim function_script.sh
2,定义函数
#使用三种不同的防范定义函数
function print_info1 () {
echo "This is func1"
return 111
}
function print_info2 {
echo "This is func2"
return 222
}
print_info3 () {
echo "This is func3"
return 333
}
3,使用命令 vim refer_script.sh 打开脚本文件
[root@wangjingjing ~]# vim refer_script.sh
4,在新的脚本文件中的调用之前定义的函数
#调用函数
. function_script.sh
#执行函数
print_info1
print_info2
print_info3
5,使用命令 bash refer_script.sh 执行新的脚本文件,结果如下:
[root@wangjingjing ~]# bash refer_script.sh
This is func1
This is func2
This is func3
四,函数的调用
在Shell中,函数调用的基本语法如下:
function_name param1 param2 …
在上面的语法中,function_name表示函数名称,其后面跟的param1、param2…表示函数的参数。Shell的函数参数的语法比较特殊。实际上,Shell将脚本参数和函数参数做了统一地处理。也就是说,Shell采用了相同的方法来处理脚本的参数和函数参数。
(1)调用函数:直接执行函数名即可。
函数名
(2)带参数的函数执行方法:
函数名 参数
与Shell脚本一样,用户可以在Shell函数中使用位置变量来获取参数值。例如,$0表示脚本名称,$#来获取函数的参数个数,$1表示第1个参数,$2表示第2个参数等,以此类推。另外,用户还可以通过系统变量$@和$*获取所有参数的值。
示例1:
调用函数:直接执行函数名即可。
1,使用命令 vim function_script.sh 打开脚本文件
[root@wangjingjing ~]# vim function_script.sh
2,定义函数并直接执行函数名
#使用三种不同的方法定义函数
function print_info1 () {
echo "This is func1"
return 111
}
function print_info2 {
echo "This is func2"
return 222
}
print_info3 () {
echo "This is func3"
return 333
}
function arg_info4 () {
#打印脚本名,不是函数名
echo "$0"
#打印第一个参数
echo "$1"
#打印第二个参数
echo "$2"
echo "$3"
}
#调用函数
print_info1
print_info2
print_info3
#调用函数并传入参数
arg_info4 1 2 3
3,使用命令 bash function_script.sh 执行脚本文件,结果如下:
[root@wangjingjing ~]# bash function_script.sh
This is func1
This is func2
This is func3
function_script.sh
1
2
3
示例2:
写一个脚本,使用函数完成
函数能够接受一个参数,参数为用户名;
判断一个用户是否存在
如果存在,就返回此用户的shell和UID;并返回正常状态值;
如果不存在,就说此用户不存在;并返回错误状态值;
1,使用命令 vim isname_exist.sh 打开脚本文件
[root@wangjingjing ~]# vim isname_exist.sh
2,定义函数,使用脚本传参调用函数
user_name=$1
#如果用户存在;返回0
#如果用户不存在;返回1
function isuser_exist() {
grep ^"$1:" /etc/passwd &> /dev/null
ret_val=$?
if [ $ret_val -eq 0 ]
then
#在/etc/passwd文件里找以$1:开始的并用:断开,取出第三段(uid)和第七段(shell)
echo `grep ^"$1:" /etc/passwd | cut -d ":" -f3,7`
return 0
else
echo "User is not exist"
return 1
fi
}
#调用函数,从脚本传参
isuser_exist $1
echo "$?"
3,使用命令 bash isname_exist.sh +用户 执行脚本文件,结果如下:
[root@wangjingjing ~]# bash isname_exist.sh redhat
1000:/bin/bash
0
[root@wangjingjing ~]# bash isname_exist.sh user0001
User is not exist
1
五,函数库文件
为了方便地重用这些功能,可以创建一些可重用的函数。这些函数可以单独地放在函数库文件中。
函数库文件定义:
创建一个函数库文件的过程非常类似于编写一个Shell脚本。脚本与库文件之间的唯一区别在于函数库文件通常只包括函数,而脚本中则可以既包括函数和变量的定义,又包括可执行的代码。此处所说的可执行代码,是指位于函数外部的代码,当脚本被载入后,这些代码会立即被执行,毋需另外调用。
函数库文件的调用
当库文件定义好之后,用户就可以在程序中载入库文件,并且调用其中的函数。在Shell中,载入库文件的命令为.,即一个圆点,其语法如下:
. filename
其中,参数filename表示库文件的名称,必须是一个合法的文件名。库文件可以使用相对路径,也可以使用绝对路径。另外,圆点命令和库文件名之间有一个空格。
六, 递归函数
Linux的Shell也支持函数的递归调用。也就是说,函数可以直接或者间接地调用自身。在函数的递归调用中,函数既是调用者,又是被调用者。
递归函数的调用过程就是反复地调用其自身,每调用一次就进入新的一层。
示例1:
用函数实现阶乘原理
1,使用命令 vim factorial_script.sh 打开脚本文件
[root@wangjingjing ~]# vim factorial_script.sh
2,定义函数
factorial() {
n=$1
if [ $n -eq 1 ]
then
#f(1)=1
echo 1
else
#当n大于1时,f(n)=f(n-1)*n
echo $((`factorial $((n-=1))` * n))
fi
}
factorial $1
3,使用命令 bash factorial_script.sh 5 求5的阶乘,结果如下:
[root@wangjingjing ~]# bash factorial_script.sh 5
120
示例2:
编写函数脚本,求1+2+…+100的和
1,使用命令 vim sum_script.sh 打开脚本文件
[root@wangjingjing ~]# vim sum_script.sh
2,定义函数
sum() {
n=$1
if [ $n -eq 1 ]
then
echo 1
else
echo $(( `sum $((n-=1))` + n ))
fi
}
sum $1
3,使用命令 bash sum_script.sh 100 执行文件,结果如下:
[root@wangjingjing ~]# bash sum_script.sh 100
5050