背景
如今,不会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这个变量很容易在内部和外部都被修改,导致内部修改失效。
新闻热点
疑难解答