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"