首页 > 技术文章 > shell脚本之——函数

weq0805 2021-07-21 09:39 原文

一、函数概念及格式

1、函数的概念

函数定义:封装的可重复利用的具有特定功能的代码

函数就是可以在shell脚本当中做出一个类似自定义执行的命令的东西,最大的功能就是简化我们很多的代码。

  • 将命令序列按照格式书写在一起
  • 可方便重复使用命令序列

2、函数的格式

2.1 格式一

[function] 函数名 (){
	命令序列
	[return x]         #使用return或者exit可以显式的结束函数
}

2.2 格式二

函数名(){
	命令序列
}

二、函数调用的方法

1、格式

函数名  [参数1] [参数2]

2、实例操作

写一个脚本里面包括函数备份yum线上源,创建yum本地源和清理缓存安装httpd服务

2.1 格式

#!/bin/bash
#创建本地yum源仓库,并安装httpd服务

backup () {
   cd /etc/yum.repos.d
   mkdir repo.bak
   mv *.repo repo.bak
   mount /dev/cdrom /mnt &> /dev/null
}

function configuration {
   echo -e '[loacal]\nname=local\nbaseurl=file:///mnt\nenable=1\ngpgcheck=0' > /etc/yum.repos.d/local.repo
}

setup () {
  yum clean all
  yum makecache
  yum install -y httpd &> /dev/null
}

#############main###############
backup
configuration
setup   

2.2 实例操作  

     

二、函数的返回值

1、return的概念

return 语句的作用是终止一个函数的执行,结束当前代码块中return后的语句,即return后的语句不再执行,从当前函数退出,为该函数返回一个指定的expression 值。如果 expression 被省略, 或在函数内没有 return 语句被执行,则把值 undefined 赋给调用当前函数的表达式。

即当函数执行return后,函数体将被赋值为函数的返回值(即return指定的返回值,可以是任何数据类型甚至是一种方法)

2、return的作用

返回函数结果
语法为:return+表达式

语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果。return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值, 由return后面的参数指定。return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误!当执行return语句时,即使函数主体中还有其他语句,函数执行也会停止!

返回函数控制
语法为:return;

通常情况下return后面跟有表达式,但是并不是绝对的。此情况就是单纯的将控制权转交给主调函数继续执行。

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:

  • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
  • 退出状态码必须是0~255,超出时值将为除以256取余

3、实例操作一:return返回值

3.1 格式

#!/bin/bash

function test1 {
   read -p "请输入一个值:" value
   return $[$value * 2]

}

test1  #调用函数
echo $?  

3.2 运行结果

4、实例操作二:在实例一的基础上,如何将大于256的值正常输出

4.1 格式

#!/bin/bash

function test1 {
   read -p "请输入一个值:" value
   #return $[$value * 2]
   echo $[$value * 2]

}

#test1    #调用函数
result=$(test1)
echo $result  

4.2 输出结果

三.函数传参

函数也是有参数的,它的内置变量与shell脚本很类似,函数名称代表示$0,而后续的变量也是以$1、$2…来替换的

1、实例操作一

1.1、格式

 

#!/bin/bash
sum() {
   echo "第一个位置参数为$1"
   echo "第二个位置参数为$2"
   sum1=$[$1 + $2]
   echo $sum1
}

 read -p "请输入第一个参数:" first
 read -p "请输入第二个参数:" second

sum $first $second  

 

2.1、输出结果

 

2、实例操作二

2.1 格式

#!/bin/bash
#Function and the cords

sum(){

    sum1=$[$1 + $2]
    echo "$1 $2的和为:$sum1"
}

    sum $1 $2  

2.2 输出结果

 

 四、函数变量的作用范围

1、概念

函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令

2、实例操作一

2.1 格式

#!/bin/bash

func () {
#local i=10
i=8
echo $i
}


func
echo $i  

2.2 输出结果

 

3、实例操作二

3.1 格式

#!/bin/bash

func () {
local i=10
echo $i
}

func
echo $i  

3.2 输出结果

五、函数的递归

函数调用自己本身的函数

1、函数的递归应用:阶乘

阶乘(factorial)是基斯顿·卡曼(Christian Kramp, 1760 – 1826)于1808年发明的运算符号。

阶乘,也是数学里的一种术语。

阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。

例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。 例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。

在表达阶乘时,就使用“!”来表示。如h阶乘,就表示为h!

阶乘一般很难计算,因为积都很大。

1.1 格式

#!/bin/bash

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

read -p "请输入一个阶乘的数字:" n
result=$(fact $n)                       #该值跟local result 不同
echo "$n的阶乘结果是 $result"  

1.2 实例操作

 

 2、函数的递归应用:递归目录

案例:

mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,
输出环境变量PATH所包含的所有目录以****************22及其中的子目录和所有不可执行文件

2.1 格式

#!/bin/bash

list_files() {
  for i in $(ls $1)
  do
     if [ -d "$1/$i" ];then
        echo "$2$i"
        list_files "$1/$i" " $2"
     else
        if [ ! -x "$1/$i" ];then
        echo "$2$i"
        fi
     fi
  done
}
###############main##############
OLDIFS=$IFS
IFS=$IFS':'

for folder in $PATH
do
  echo $folder
  list_files "$folder" " "

done
IFS=$OLDIFS

2.2 实例操作

2.3  格式

#!/bin/bash
#Output all directories contained in the environment variable PATH along with subdirectories and any non-executable files  

output () {

for n in $(ls $1)
do
   if [ -d "$1/$n" ];then
      echo "----目录$2$n"
      output "$1/$n" "---子目录$2"
   else
      if [ ! -x "$1/$n" ];then
      echo "---不可执行文件$n"
      fi
   fi
done
}

#########main############
OLDIFS=$IFS
IFS=$IFS':'

for i in $PATH
do
   echo $i
   output $i
done

IFS=$OLDIFS  

2.4  输出结果

六、创建函数库

 1、创建数据库格式

#!/bin/bash
#Create a database

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

addition () {
     echo $[$1 + $2]
}

subtraction () {
     echo $[$1 - $2]
}

multiplication () {
     echo $[$1 * $2]
}

division () {
    if [ $2 -ne 0 ];then
       echo $[$1 / $2]
    else
       echo "被除数不能为0"
    fi
}

2、调用数据库脚本格式

. /root/demoq9.sh

value1=$1
value2=$2

result1=$(addition $value1 $value2)
result2=$(subtraction $value1 $value2)
result3=$(multiplication $value1 $value2)
result4=$(division $value1 $value2)
result5=$(fact $value1)


echo "加法的结果为 $result1"
echo "减法的结果为 $result2"
echo "乘法的结果为 $result3"
echo "除法的结果为 $result4"
echo "$value1的阶乘结果为 $result5"
~                               

3、输出结果

    

推荐阅读