shell 函数详解
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
函数
一什么是函数
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