目录
- shell函数
- 1.函数的作用
- 2.函数的基本格式
- 3.函数注意事项
- 4.函数调用的方法
- 5.函数的返回值
- 6.函数的传参
- 7.在外部调用函数
- 8.函数变量的作用范围
- 9.函数的递归
- 10.函数库的作用
shell函数
1.函数的作用
- 语句块定义成函数约等于别名,定义函数,再引用函数
- 封装的可重复利用的具有特定功能的代码
2.函数的基本格式
法一:
[function] 函数名 (){
命令序列
[return x] #使用return或者exit可以显式的结束函数
}
法二:
函数名(){
命令序列
}
3.函数注意事项
1.直接写函数中调用
2函数直接写函数名同名函数后一个生效
3.调用函数一定要先定义
4.只要先定义了调用的其他函数,定义顺序无关
4.函数调用的方法
示例:
#!/bin/bash
h () {
echo "hello"
}
w () {
echo "world"
}
nihao () {
h
w
}
h
w
nihao
示例:
#!/bin/bash
#递归环境变量PATH里包含的所有目录,显示所有目录下的子目录和文件
IFS_OLD=$IFS
IFS=$IFS':'
list() {
for fd in $1/*
do
if [ -d $fd ];then
echo "$fd 是目录"
list "$fd"
else
echo "$fd 是文件"
fi
done
}
for dir in $PATH
do
list $dir
done
IFS=$IFS_OLD
- 使用函数可以避免代码重复
- 使用函数可以将大的工程分为若干小的功能模块,代码的可读性更强
5.函数的返回值
- return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
- 函数的使用原则
- 1.函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
2.退出状态码必须是0~255,超出时值将为除以256取余。
示例:
#!/bin/bash
user () {
if [ $USER = root ]
then echo "这是管理员用户"
else
echo "这不是管理员"
return 1
fi
}
user
6.函数的传参
- 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。
- 示例:
#!/bin/bash
sum () {
echo "第一个变量:" $1
echo "第二个变量:" $2
let n=$1+$2
echo $n
}
sum $2 $1
7.在外部调用函数
- 在外部调用命令需要先source一下。然后调用函数,再调用函数中的变量
[root@yxp data]#vim function.sh
#!/bin/bash
color () {
RED="echo -e \E[31m"
GREEN="echo -e \E[32m"
END="\E[0m"
}
示例:
在脚本中调用
8.函数变量的作用范围
- 函数在shell脚本中仅在当前shell环境中有效(除非使用source运行,在运行shell脚本中,是在一个子shell环境中运行的)
- shell脚本中变量默认全局有效
- 将变量限定在函数体内部使用local命令
- 示例:
#!/bin/bash
aa () {
a=10
}
a=20
aa
echo $a
示例2:
#!/bin/bash
aa () {
local a=10
}
a=20
aa
echo $a
9.函数的递归
- 函数调用自己本身的函数(直到没有目录为止)
#!/bin/bash
#使用递归进行阶乘运算
fact () {
#判断传入的参数,如果是1,则直接输出1
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
#如果传入的参数不是1,则函数调用函数自身,传入参数计算
echo $[$1 * $result]
fi
}
#####main######
read -p "请输入一个正整数:" num
result=$(fact $num)
echo "$num 的阶乘结果是:$result"
#fact 5
#递归分解
#5 temp=4 result=$(fact 4) echo 5 * $(fact 4)
#fact 4
#4 temp=3 result=$(fact 3) echo 5 * 4*$(fact 3)
#fact 3
#3 temp=2 result=$(fact 2) echo 5 * 4*3$(fact 2)
#fact 2
#2 temp=1 result=$(fact 1) echo 5 * 4*3*2*$(fact 1)
#fact 1
#1 temp=4 result=$(fact 4) echo 5 * 4*3*2*1*$(fact 4)
10.函数库的作用
- 可以事先创建一个函数库文件,在里面定义各种常用的函数,然后可以在别的shell脚本中直接引用这个函数库文件,使得不需要再次定义函数即可直接调用函数
[root@localhost ~]# cat myfunctions.sh
#!/bin/bash
#创建函数库文件
jiafa(){
echo $[$1 + $2]
}
jianfa(){
echo $[$1 - $2]
}
chengfa(){
echo $[$1 * $2]
}
chufa(){
if [ $2 -eq 0 ];then
echo "除数不能为0"
else
echo $[$1 / $2]
fi
}
fact(){
if [ $1 -eq 1 ];then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
echo $[$1 * $result]
fi
}
#!/bin/bash
#调用函数库
source ~/myfunctions.sh
v1=10
v2=5
res1=$(jiafa $v1 $v2)
res2=$(jianfa $v1 $v2)
res3=$(chengfa $v1 $v2)
res4=$(chufa $v1 $v2)
res5=$(fact $v1)
echo "加法结果为:$res1"
echo "减法结果为:$res2"
echo "乘法结果为:$res3"
echo "除法结果为:$res4"
echo "${v1}阶乘结果为:$res5"