shell之函数(函数的定义,引用,以及全局变量和局部变量)

 函数可以确保命令循环执行,可以解决命令多重复的情况,函数用来简化脚本,使脚本可以循环执行

1.函数的语法

(1)方法1

函数名(){
	函数体
	return n
	}

(2)方法2(这样比较规范)

function 函数名(){
	函数体
	return n
	}
练习:实现函数
[root@base1 mnt]# vim function_01.sh 
 #!/bin/bash 
 function fun() { 
     echo " I love English" 
 }
fun

在这里插入图片描述

[root@base1 mnt]# sh function_01.sh 
 I love English

2.调用函数

[root@base1 mnt]# vim function_02.sh 
 #!/bin/bash 
 function fun1() { 
     echo "I like animals"     # 定义和函数内部
 } 
 count=1 
 while [ $count -le 3 ] 
 do 
     fun1                      # 调用函数
     count=$[ $count + 1 ] 
 done
 echo "end of loop"            # 结束循环
 echo "end of script"          # 结束脚本

在这里插入图片描述

[root@base1 mnt]# sh function_02.sh

在这里插入图片描述

3.引用函数

每次引用函数时,bash会重新回到函数的定义 

注:函数不一定要在最开始定义,但是如果函数在定义前使用,会报错

#举例:

[root@base1 mnt]# vim  function_03.sh 
 #!/bin/bash 
 count=1        # 定义计数器
 echo "Before function definition" 
 function fun1() { 
     echo "fun1"         # 定义fun1
 } 
 while [ $count -le 5 ] 
 do 
     fun1 
     count=$[ $count + 1 ] 
 done 	  
 echo "End of loop"
  	 fun2      # 调用fun2,但是fun2还没有定义
 function fun2() {     # 定义fun2
   echo "fun2"   
 }

在这里插入图片描述

[root@base1 mnt]# sh function_03.sh

在这里插入图片描述

函数名必须是唯一的,如果重新定义了函数。新的函数会覆盖旧的

举例:

[root@base1 mnt]# vim  function_04.sh  
 #!/bin/bash 
 function fun1() { 
     echo "fist fun1"  
 } 
 fun1 
 function fun1() { 
     echo "second fun1" 
 } 
 fun1 
 function fun1() {
     echo "third fun1" 
 } 
 fun1 
 echo "End..."

在这里插入图片描述

[root@base1 mnt]# sh  function_04.sh

在这里插入图片描述

4.返回值

(1)默认退出状态码

默认情况下,函数的退出状态码就是函数最后一条命令的返回的退出状态码,用 $? 查看

#举例:

[root@base1 mnt]# vim function_exit_01.sh 
 #!/bin/bash 
 function fun1() { 
     echo "trying to display a non-existent file" 
     ls -l file &> /dev/null 
 } 
 echo "test the function: " 
 fun1 
 echo "The exit status is: $?" 

在这里插入图片描述

[root@base1 mnt]# sh function_exit_01.sh 

在这里插入图片描述

(2)使用return命令(返回函数特定状态码)

Shell使用return命令来退出函数,并返回特定的退出状态码,返回值在0~255之间

[root@base1 mnt]# vim function_exit_02.sh 
10 #!/bin/bash 
11 function db1() { 
12     read -p "Enter a value:" value 
13     echo "doubling the value..." 
14     return $[ $value * 2 ] 
15 } 
16 db1 
17  
18 echo " The new  value is $?"

在这里插入图片描述

[root@base1 mnt]# sh function_exit_02.sh

在这里插入图片描述

(3)使用函数输出将函数的输出保存在shell变量中,可以获得任何类型的函数输出,并将其保存到变量中

 [root@base1 mnt]# vim function_exit_03.sh 
  #!/bin/bash 
  function db1() { 
      read -p "Enter a value:" value 
      echo $[ $value * 2 ] 
  } 
  result=`db1` 
  echo "The new value is $result"

在这里插入图片描述

[root@base1 mnt]# sh function_exit_03.sh

在这里插入图片描述

(4)函数中使用变量

可以向函数中传递参数,函数名会在$0变量中定义,函数命令行上的任何参数都会通过$1,$2定义

$# 来判断传给函数的参数数目
练习1:定义算法,当脚本后什么都不输入时,输出-1,当脚本后输入一个数字时,把这个数字扩大2倍,当输入两个数字时,把这两个数字相加
[root@base1 mnt]# vim function_value_01.sh 
 #!/bin/bash 
 a=$1    # 第一串字符定义为变量a
 b=$2    # 第二串字符定义为变量b
 c=$#    # 用变量c来记录输入字符的个数
 function addem() { 
     if [ "$c" == 0 ];then 
         echo "-1"           # 当没有输入数字的时候输出-1
     elif [ "$c" == 1 ];then 
         echo  $[ a + a ]    # 当输入一个数字的时候,把这个数字扩大为二倍
     elif [ "$c" == 2 ];then 
         echo  $[ a + b ]    # 当输入两个数字的时候,把这两个数字相加
     else 
       echo "error" 
     fi 
 } 
 addem   # 调用函数

在这里插入图片描述

[root@base1 mnt]# sh function_value_01.sh         # 不输入数字
-1
[root@base1 mnt]# sh function_value_01.sh 1       # 输入一个数字
2
[root@base1 mnt]# sh function_value_01.sh  1  2   # 输入两个数字
3
练习2:定义算法,当用户的输入不符合输入要求时,告诉用户具体用法,当输入正确时,计算乘积
[root@base1 mnt]# vim function_value_02.sh 
 #!/bin/bash 
 function fun1() { 
     echo $[ $1 * $2 ] 
 } 
  
 if [ $# -eq 2 ];then 
     value=`fun1 $1 $2` 
     echo "The result is $value" 
 else 
     echo "Usage:fun1 a b" 
 fi

在这里插入图片描述

[root@base1 mnt]# sh  function_value_02.sh 10
Usage:fun1 a b
[root@base1 mnt]# sh  function_value_02.sh 10 10
The result is 100

(5)函数不能从命令行获取脚本的参数值

[root@base1 mnt]# vim overall_value.sh 
 #!/bin/bash 
 function fun1(){ 
     db1=$[ $value * 2 ] 
 } 
 read -p "Enter a value:" value 
 fun1 
 echo "The new value is:" $value

在这里插入图片描述

[root@base1 mnt]# sh overall_value.sh

在这里插入图片描述

2.变量的作用域

(1)全局变量

  任何地方都生效的变量,默认情况下,脚本主体内定义全局变量,函数内可以用,函数外也可以

[root@base1 mnt]# vim overall_value_02.sh 
 #!/bin/bash 
 function fun1(){ 
     temp=$[ $value + 5 ] 
     result=$[ $temp *2 ] 
 } 
 temp=4   # 这两个变量是全局变量,既可以引用到上面的函数中,也可以引用到下面的条件中 
 value=6 
  
 fun1 
 echo "The result is $result" 
 if [ $temp -gt $value ];then 
     echo "temp is lager" 
 else 
     echo "temp is smaller" 
 fi

在这里插入图片描述

[root@base1 mnt]# sh overall_value_02.sh 
The result is 22
temp is lager 

(2)局部变量

  不能被引用到函数外
  
  定义方法:local value

[root@base1 mnt]# vim overall_value_02.sh 
 #!/bin/bash 
 function fun1(){ 
     local temp=$[ $value + 5 ]  # 定义temp为局部变量 
     result=$[ $temp *2 ] 
 } 
 temp=4   # 这两个变量是全局变量,既可以引用到上面的函数中,也可以引用到下面的条件中 
 value=6 
  
 fun1 
 echo "The result is $result" 
 if [ $temp -gt $value ];then  # 此处的temP变量是temp=4这个全局变量,并不是fun1中的局部变量 
     echo "temp is lager" 
 else 
     echo "temp is smaller"	

在这里插入图片描述

[root@base1 mnt]# sh overall_value_02.sh   # 和上面全局变量比较,发现了什么不同呢
The result is 22
temp is smaller
练习1:用函数实现计算阶乘
[root@base1 mnt]# vim jc.sh 
 #!/bin/bash 
 function jc(){ 
     if [ $1 -eq 1 ];then # 当输入的数字是1时,输出1 
         echo 1 
     else 
         local temp=$[ $1 - 1 ]   # 定义局部变量temp 
         local result=`jc $temp`  # 定义局部变量result 
         echo $[ result * $1 ] 
     fi 
 } 
 read -p "Enter a value: " value 
 result=`jc $value`  # 计算结果 
 echo "The jc of $value is: $result"  

在这里插入图片描述

[root@base1 mnt]# sh jc.sh 
Enter a value: 5
The jc of 5 is: 120
[root@base1 mnt]# sh jc.sh 
Enter a value: 3
The jc of 3 is: 6 

猜你喜欢

转载自blog.csdn.net/wzt888_/article/details/86033714
今日推荐