首页 > 系统 > Linux > 正文

Shell中关于处理方法返回值问题详解

2019-10-26 18:56:08
字体:
来源:转载
供稿:网友

背景

如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux。通过shell编程,写一些工具批处理的时候,经常需要自定义函数。更复杂点的情况下,可能有需要返回一个值。

由于在shell的世界中,并不像其他编程语言,它不支持我们所熟悉的方法返回。本文一起总结一下如何优雅的解决返回值问题?

测试程序

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

新建testReturn脚本

returnString(){ return $1}returnString $1result=$?echo "result=$result"

现在我们有一个testReturn的脚本,里面有一个returnString的方法,我们希望它能够直接返回我们输入的参数。
当我们分别以hello,500,12作为输入参数时,他的执行和输出情况是一样的么?

./testReturn hello./testReturn 500./testReturn 12

在心中试着猜一下可能的情况,现在我们来揭晓答案:

程序输出情况

在执行hello的时候,并没有输出hello,而是报了一个return只接受数字类型的错误

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello./testReturn: line 23: return: hello: numeric argument requiredresult=255

在执行500的时候,页没有输出500,而是输出了244

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500result=244

执行12的时候,终于正确了,返回12

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12result=12

异常分析

现在我们分析一下returnString这个方法,为什么会有这么多种输出情况呢?

首先他的写法显然是不严谨的,但也不是完全错误,比如输入12他就正确返回了。

return本身是shell里面的buildin函数,笔者总结了下,他有以下几个特征:

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

全局变量

如果我们就是要返回一个字符串,怎么办呢?可以通过定义全局变量来进行赋值,类似于静态变量/成员变量的写法,我们让他的作用域穿透整个上下文。

result=""returnString(){ result=$1}returnString $1echo "result=$result"

再看一下输出,得到了我们需要的结果:

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn helloresult=helloaven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500result=500aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12result=12

但是这样写,会污染全局变量,并且result这个变量很容易在内部和外部都被修改,导致内部修改失效。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表