今天有个开发人员写了这么一段shell(当然我把业务给省略了,真实情况当然没这么简单):
#!/bin/sh
function foo(){
result=$(echo $1)
return $result
}
function invoker(){
foo $1
return $?
}
invoker 13
echo $?
invoker 1011
echo $?
大家猜想一下结果,开发人员认为应该打印13和1011,但结果却是13和243,打开shell的debug信息:
+ invoker 13
+ foo 13
++ echo 13
+ result=13
+ return 13
+ return 13
+ echo 13
13
+ invoker 1011
+ foo 1011
++ echo 1011
+ result=1011
+ return 1011
+ return 243
+ echo 243
243
大家发现返回13的时候正常而1011怎么就会变成243呢?
其实这里有一个本质性的错误,那就是shell获得函数的返回值的方式基本只有两种:1. 将返回值打印到标准输出或者是文件2. 将返回值赋值给全局变量
如果这样写:
#!/bin/sh
function foo(){
result=$(echo $1)
echo $result
}
echo `foo 13`
echo `foo 1011`
运行结果就正确了,而且代码废话还少很多。
回到问题上来,那shell里面用return是什么意思呢?其实它只是执行函数执行的状态码,比如执行成功肯定返回0,不成功返回一个1~255之间的数。所以当传入1011时超过了255的范围,被截断为后8位,变成243了。
所以,shell中的return和Java、Python这种语言的return是不一样的,不要想当然,同时shell中的return只能返回数字,如果你试图返回字符串之类运行时就会报错。
在繁华中体会热闹;若是厌倦了喧嚣,寻一处宁静的幽谷,