Shell函数

目录

一、Shell函数

         shell函数的概括

Shell函数的优点

Shell函数的定义 

Shell函数的返回值

如何获取函数返回值?  

函数传参

Shell函数变量的作用范围

二、函数的递归

实例1  阶乘

示例2:递归目录  

三、函数库文件 

1.准备函数库 

 2.在脚本中加载函数库文件  


一、Shell函数

1.shell函数的概括
Shell函数的优点
  • 可以避免代码重复
  • 可以将大的工程分割为若干小的功能模块,代码的可读性更强
Shell函数的定义 
#函数定义1
function 函数名 {
  命令序列
}
 
#函数定义2
函数名() {
  命令序列
}
 
##### main #######
#可以在主代码区域中直接使用函数名调用函数
函数名
Shell函数的返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余

 

如何获取函数返回值?  

方法1  只能返回0-255之间的数值,超出部分为除以256取余数

[root@localhost ~]# vim 1.sh
#!/bin/bash
db2() {
   read -p "请输入一个整数:" num
   sum=$[$num * 2]
   return $sum
}


####### main #######

db2
echo "$?"

[root@localhost ~]# chmod +x 1.sh
[root@localhost ~]# bash 1.sh
请输入一个整数:300
88
[root@localhost ~]# vim 1.sh
[root@localhost ~]# bash 1.sh
请输入一个整数:180
104
[root@localhost ~]# bash 1.sh
请输入一个整数:100
200

 方法2

[root@localhost ~]# vim 1.sh

#!/bin/bash
db2() {
   read -p "请输入一个整数:" num
   sum=$[$num * 2]
   echo $sum
}


####### main #######

result=$(db2)
echo $result


[root@localhost ~]# bash 1.sh
请输入一个整数:20
40
[root@localhost ~]# bash 1.sh
请输入一个整数:200
400
[root@localhost ~]# bash 1.sh
请输入一个整数:300
600
函数传参

通过在 调用函数时,后面跟位置参数;在函数体里使用 $1 $2 来引用函数后面跟的位置参数

函数体里面的 $1$2 代表的是调用函数时,函数名后面跟的 第一个 第二个 位置参数 

[root@localhost ~]# vim 2.sh
[root@localhost ~]# chmod +x 2.sh
[root@localhost ~]# bash 2.sh
输入第一个参数:10
输入第二个参数:25
10 + 25 的和为 35
[root@localhost ~]# vim 2.sh

#!/bin/bash

db1() {
  sum=$[$1 + $2]
  echo $sum
}

##### main #######

read -p "输入第一个参数:" num1
read -p "输入第二个参数:" num2

sum1=$(db1 num1 num2)

echo "$num1 + $num2 的和为 $sum1"
Shell函数变量的作用范围

函数默认只能在脚本内的shell环境有效

脚本中的变量默认全局有效(即函数体内外部有效)

在函数体内执行 local 变量,可将变量限定在函数体内部使用

[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
8
[root@localhost ~]# vim 3.sh

#!/bin/bash
i=3
i=8
echo $i

#输出8,因为i的值被覆盖了
[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
8
[root@localhost ~]# vim 3.sh

#!/bin/bash
myfun() {
    i=3
}
####### main #######
myfun
i=8
echo $i

#主函数开始运行,第一步函数调用i=3,然后i=8覆盖后输出
[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
2
3
[root@localhost ~]# vim 3.sh
#!/bin/bash
 
myfun() {
    i=2
    echo $i
}
########## main ###########
myfun
i=3
echo $i


#调用函数时输出函数里面i=2,而后输出的i被i=3覆盖
[root@localhost ~]# vim 3.sh
[root@localhost ~]# chmod +x 3.sh
[root@localhost ~]# bash 3.sh
3
7
[root@localhost ~]# vim 3.sh

#!/bin/bash
myfun() {
    local i
    #local定义的变量只能在local之后到函数结束前有效
    i=3
    echo $i
}
########## main ###########
i=7
myfun
echo $i

#local限定了函数i的值,函数外不能重新覆盖,而没有local的变量时全局有效的

二、函数的递归

函数调用自己本身的函数

实例1  阶乘
[root@localhost ~]# vim 4.sh
[root@localhost ~]# chmod +x 4.sh
[root@localhost ~]# bash 4.sh
请输入求阶乘的数值:1
1阶乘的值为1
[root@localhost ~]# bash 4.sh
请输入求阶乘的数值:10
10阶乘的值为3628800
[root@localhost ~]# vim 4.sh

#!/bin/bash
#递归求介绍

fact() {
    if [ $1 -eq 1 ];then
       echo 1
    else
      tmp=$[$1 - 1]
      result=$(fact $tmp)
      echo $[$1 * $result]
   fi
}

read -p "请输入求阶乘的数值:" num
res=$(fact $num)

echo "$num阶乘的值为$res"
示例2:递归目录  
#!/bin/bash
#递归目录

dgdir() {
     for i in $(ls $1)
     do
         if [ -d $1/$i ];then
             echo -e "$2$i 为目录"
             dgdir $1/$i "\t$2"
        else
            echo -e "$2$i 为文件"
       fi
       done
}



######## main ########

read -p "请用绝对路径输入你要递归查看的目录名:" folder

dgdir $folder ""

三、函数库文件 

以将经常使用的函数存入一个单独的函数文件,然后将函数文件载入shell,再进行调用函数.

1.准备函数库 
[root@localhost ~]# cd /opt
[root@localhost opt]# vim 1.sh


jiafa() {
        echo $[$1 + $2]
}
jianfa() {
        echo $[$1 - $2]
}
chengfa() {
        echo $[$1 * $2]
}
chufa() {
        if [ $2 -ne 0 ];then
         echo "除数不能为0"
        else
         echo $[$1 % $2]
        fi
}
fact() {
        if [ $1 -eq 1 ];then
                echo 1
        else
                temp=$[$1-1]
                result=$(fact $temp)
                echo $[$1 * $result]
        fi
}
 2.在脚本中加载函数库文件     一定要在脚本中加载函数库,用source或者点(.)
[root@localhost ~]# vim 6.sh

#!/bin/bash
source /opt/1.sh

value1=$1
value2=$2

res1=$(jiafa $value1 $value2)
res2=$(jianfa $value1 $value2)
res3=$(chengfa $value1 $value2)
res4=$(chufa $value1 $value2)
res5=$(fact $value1 $value2)

echo "加法的结果为$res1"
echo "减法的结果为$res2"
echo "乘法的结果为$res3"
echo "除法的结果为$res4"
echo "阶乘的结果为$res5"

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值