最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

Linux Shell中关于处理函数返回值的问题详解

XAMPP新闻 admin 50浏览 0评论

结合:逗比小憨憨录制的《Shell编程基础入门》第八章函数 一起学习

测试程序

我们一般通过$?来获取上一个语句的输出。看一下下面的测试语句:

func(){

return $1

}

func $1

result=$?

echo “result=$result”

我们希望它能够直接返回我们输入的参数。当我们分别以doubixiaohanhan,256,255作为输入参数时,运行此脚本发现:

1,source a.sh 256

返回结果:result=0

2,source a.sh 255

返回结果:result=255

3,source a.sh doubixiaohanhan

返回结果:报错

(-bash: return: doubixiaohanhan: numeric argument required

result=2) 报了一个return只接受数字类型的错误

异常分析

分析一下为什么会有这么多种输出情况呢?

首先这种写法不严谨,但也不是完全错误,比如输入255他就正确返回了。

return本身是shell里面的buildin函数。

原因分析如下:

  • return可以返回数字状态,常常用于返回0,1,表示一个函数执行后是否成功
  • 注意return不可以返回非数字类型
  • 同时数字类型也有可能发生溢出现象

解决方法:

1,通过全局变量访问

如果我们就是要返回一个字符串,怎么办呢?可以通过定义全局变量来进行赋值,类似于静态变量/成员变量的写法,程序如下:

result=”"

func(){

result=$1

}

func $1

echo “result=$result”

缺点:全局变量会使程序逻辑变得复杂混乱,改进方法:

(1)局部变量

除了return,还有其他一些buildin的关键字,比如eval,local。默认在当前脚本定义的变量都是全局变量,在方法中则可以通过local来定义局部变量,这样可以避免全局变量污染。同时结合eval赋值语句,来实现变量的修改。

func(){

local __result=$2

eval $__result=$1

}

func $1 re

echo “result=$re”

(2)echo

最后在介绍一种方法,通过echo输出,结合command substitution命令替换。如果你的方法内部只有一处echo输出,那么也可以利用它来进行值得返回,不过这个就有点局限性,一定要确保方法内只有一次输出,否则就会出现赋值内容过多。

func(){

local __result=$1

echo $__result

}

val=$(func $1)

echo “result=$val”

越界问题

根据测试,我们推断shell的内置return承接返回值用的是一个字节的大小,也就是8位,最多可以输出无符号0-255的整型,范围之外的数据全部溢出显示。因此在使用return的时候,务必留意数值大小。

转载请注明:XAMPP中文组官网 » Linux Shell中关于处理函数返回值的问题详解