Shell函数:基本语法、函数传参、函数变量、返回值



函数

函数基本语法

shell 可以用户定义函数,然后在shell脚本中可以随便调用。

格式

[ function ] funname [()]
{
    action;
    [return int;]  
}

说明:

  • 前部 function 可省,后面括号不可省
  • 写在一行时行尾大括号前要加分号,如 function ccc(){ echo "ccc" ; }
  • return
    • 参数返回可省。return 返回,如果不加,将以最后一条命令运行结果,作为返回值。

    • 函数返回值在调用该函数后通过 $? ****来获得。

    • return 后跟数值 n(0-255),超出时将自动除以256取余。若所需值过大可使用echo。return用于返回状态码。约定俗成地,返回码为 0 表示成功,非零值表示失败或错误。

    • Shell中的 return 命令通常用于在函数内部控制流程,并将状态码或结果传递给调用者。

    • return 和 exit 区别

      在 Shell 函数中,可以使用 exit 语句来终止函数的执行并返回一个退出状态码。

      当函数执行到 exit 语句时,整个脚本将立即停止执行,并将指定的退出状态码返回给调用者

      return和exit的区别在于它们的作用范围:return只作用于函数内部,而exit作用于整个脚本。

      如果想从函数中返回一个值并继续执行脚本,应该使用return语句;

      如果想在任何时候结束整个脚本的执行,应该使用exit语句。

示例1

function abc() { # 定义函数,使用echo输出计算结果  
   read -p "请输入:" a
   a=$((a*2)) # 直接输出计算结果 
   return 0 # 返回状态码0表示成功  
}

# 调用函数并将其返回值保存在result变量中
abc
result=$?

# 检查返回值是否为0,并打印result变量的值
if [ $result -eq 0 ]
then
   echo "函数返回值为:$result" #应该是0
else
   echo "函数执行出错!"
fi

示例2

使用 $? 获得返回值

#!/bin/bash
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

函数传参

在 Shell 中,调用函数时可以向其传递参数。

位置参数用于实现参数传递,使函数能够根据不同的输入执行相应的操作。

在函数内部,通过使用位置参数 $n 来获取参数的值:

  • $1表示第一个参数
  • $2表示第二个参数的等
  • 以此类推

示例1:方式一

交互输入传参

#!/bin/bash
sum1 () {
   sum=$[$1 + $2] #推荐sum=$(( $1 + $2 )) 
   echo $sum
}

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

运行输出
请输入第一个参数:2
请输入第二个参数:3
5

示例2:方式二

调用函数尾部直接跟参数

#!/bin/bash
sum1 () {
   sum=$[$1 + $2]
   echo $sum
}

sum1 $1 $2
#执行:
[root@localhost aaa]#./test5.sh  10 20
30

函数变量

局部变量和全局变量

  • 局部变量:使用 local 声明,作用域仅在函数内部,避免修改全局变量。
  • 全局变量:默认情况下,Shell 中的变量是全局的,除非在函数内部用 local 限定为局部变量。

函数的作用范围

  • 函数在shell脚本中仅在当前shell环境中有效

示例1:不使用局部变量

函数内部使用不局部变量,变量会被修改。

#!/bin/bash  
abc () {  
   a=5  
   b=6  
   return 0
}  

a=8
b=12
c=9

abc

echo "a等于$a"  # 输出 5,a 被函数 abc 修改。  
echo "b等于$b"  # 输出 6,同理。  
echo "c等于$c"  # 输出 9,c 没有被修改。

示例2:使用局部变量

在函数内部使用局部变量,防止全局变量被意外修改。

#!/bin/bash  
abc () {  
   local a=5     # 使用 local 声明局部变量 a b
   local b=6  
   return 0
}  
  
a=8  
b=12  
c=9  
abc  

echo "a等于$a"  # 输出 8,函数内部的局部变量不影响全局变量 a。
echo "b等于$b"  # 输出 12,同理。  
echo "c等于$c"  # 输出 9,c 没有被修改。

示例3:局部变量不影响全局变量

在函数中使用局部变量,不影响同名的全局变量。

#!/bin/bash  

abc () {  
   local i=8  # 定义局部变量 i,并初始化为 8
   echo "inside $i"  # 打印局部变量 i 的值  
}  

i=9  # 定义全局变量 i,并初始化为 9

abc  
echo "outside $i"  # 打印全局变量 i 的值,输出 9

# 执行结果:
# inside 8
# outside 9

示例4:局部变量声明的顺序和影响

局部变量声明的顺序对全局变量的影响。 Bash 中变量作用域的特性。

#!/bin/bash  

abc () {  
   echo "inside1 $i"  # 如果函数外部已定义 i,这里会打印外部的 i 值;否则,i 未定义
   let i++  # 尝试增加 i 的值,此时操作的是全局变量 i
   local i  # 声明局部变量 i,作用域从此开始
   i=8  # 局部变量 i 被初始化为 8
   echo "inside2: $i"  # 打印局部变量 i 的值
}  

i=9  # 定义全局变量 i,并初始化为 9

abc  
echo "outside $i"  # 打印全局变量 i 的值

# 执行结果:
# inside1 9  # 函数外部定义的 i 被打印
# inside2: 8  # 局部变量 i 的值被打印
# outside 10  # 全局变量 i 被 let i++ 修改为 10

返回值调用

Shell脚本中的函数主要通过两种方式来“返回”值给调用者:

  1. 通过$?变量获取退出状态

    例如,定义一个返回值为2的函数abc,并调用它:

    #!/bin/bash
    abc() {
        return 2
    }
    abc
    echo $?  # 输出:2
    
  2. 通过标准输出(STDOUT)或标准错误(STDERR)返回更复杂的数据

    由于退出状态只能是一个整数,如果需要函数返回更复杂的数据(如字符串、数组等),可通过标准输出(通常是echoprintf命令)或标准错误(如使用>&2重定向)来“返回”这些数据。

    在调用函数时,可以通过命令替换(如$(...)或反引号...)来捕获这些输出。

    例如,定义一个函数返回字符串“Hello, World!”:

    #!/bin/bash  
    abc() {
        echo "Hello, World!"  
    }
    result=$(abc)  
    echo $result  # 输出:Hello, World!
    

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值