函数返回值作用
在其他编程语言中,返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果可通过 return 语句返回。但Shell中返回值表示的是函数的退出状态:返回值 0 表示函数执行成功,非 0 表示函数执行失败。
if、while、for 等语句都是根据函数的退出状态来判断条件是否成立。
函数的退出状态码:
默认取决于函数中执行的最后一条命令的退出状态码。
自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0 无错误返回
return 1-255 有错误返回
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
[root@mdns zaishu]#./funs
efg
The newstr is efg
缺点: 1. 需要定义全局变量;2. 需要对应上函数里面的变量。
- 通过echo得到
#!/bin/bash
function getStr() {
str=$1
echo $str # 通过echo将内容输出
return $? #返回上一条命令的退出状态
}
read m
newstr=$(getStr $m) # 通过$() 得到函数内部的输出
echo "The newstr is $newstr" #输出全局变量
[root@mdns zaishu]#./funs
opq
The newstr is opq