函数返回值作用

在其他编程语言中,返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果可通过 return 语句返回。但Shell中返回值表示的是函数的退出状态:返回值 0 表示函数执行成功,非 0 表示函数执行失败。
if、while、for 等语句都是根据函数的退出状态来判断条件是否成立。

函数的退出状态码:

默认取决于函数中执行的最后一条命令的退出状态码。
自定义退出状态码,其格式为:

return 从函数中返回,用最后状态命令决定返回值
return 0 无错误返回
return 1-255 有错误返回
  • 1.
  • 2.
  • 3.

Shell 函数的返回值是一个介于 0~255 之间的整数,其中只有 0 表示成功。

函数执行失败时,可以根据返回值判断具体出现了什么错误,比如一个打开文件的函数,指定 1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

如果函数体中没有 return 语句,那么使用默认的退出状态,也就是最后一条命令的退出状态。也就是 return $?,$?是一个特殊变量,用来获取上一个命令的退出状态。

得到函数处理结果

return 表示退出状态,但想得到函数处理结果,可以两种解决方案:

  • 一种是借助全局变量,将得到的结果赋值给全局变量;
  • 一种是在函数内部使用 echo、printf 命令将结果输出,在函数外部使用$()或者``捕获结果。

下面我们具体来定义一个函数 getsum,计算从 m 加到 n 的和,并使用以上两种解决方案。

示例

  • 通过全局变量
#!/bin/bash
str="abc"
function changeStr() {
    str=$1
    return $? #返回上一条命令的退出状态
}
read m
if changeStr $m; then  # 通过命令的退出状态判断
    echo "The newstr is $str" #输出全局变量
else
    echo "Error!"
fi
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
[root@mdns zaishu]#./funs 
efg
The newstr is efg
  • 1.
  • 2.
  • 3.

缺点: 1. 需要定义全局变量;2. 需要对应上函数里面的变量。

  • 通过echo得到
#!/bin/bash
function getStr() {
    str=$1
    echo $str  # 通过echo将内容输出
    return $? #返回上一条命令的退出状态
}
read m

newstr=$(getStr $m) # 通过$() 得到函数内部的输出
echo "The newstr is $newstr" #输出全局变量
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
[root@mdns zaishu]#./funs 
opq
The newstr is opq
  • 1.
  • 2.
  • 3.