Shell函数返回值详解
shell脚本中,执行函数
通常来说函数返回值有两类
1. 函数执行状态码
我更愿意称之为函数执行状态码
标识函数是否执行成功,返回值只能是整数 ,在0-255之间,0表示成功,其他值表示失败
-
函数内,显示使用return 语句,指定 函数返回值,(0-255)
-
不显示使用return 语句,会将最后一条命令运行结果状态作为返回值
-
获取该状态码,需要在函数执行后,立即从 $? 变量获取 ,因为该变量只显示最后命令的退出状态
-
$? |
仅显示最后命令的退出状态,0表示没有错误,其他表示有错误; |
举例
- return 整数 0-255,获取为正常状态码
- return 字符串,报错,test.sh: line 11: return: xyz: numeric argument required
- return 整数大于255,返回值 为 整数 取模256 ,如下例 64789 % 256 = 21
- 不显示使用return 语句,则函数内最后一条命令的执行结果,0为正常,其他错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/bin/bash
function foo0() { return 64789 }
function foo1() { return 1 } function foo2() { return "xyz" }
function fooa() { ls *.sh } function foob() { ls *.ksh }
foo0 echo -e "foo0 return $?\n.." foo1 echo -e "foo1 return $?\n.." foo2 echo -e "foo2 return $?\n.." fooa echo -e "fooa return $?\n.." foob echo -e "foob return $?\n.."
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| foo0 return 21 .. foo1 return 1 .. test.sh: line 11: return: xyz: numeric argument required foo2 return 255 .. excutep.sh test.sh fooa return 0 .. ls: cannot access *.ksh: No such file or directory foob return 2 ..
|
2. 用户自定义的函数执行返回结果
也有两种方式
1. 函数内 给全局变量 赋值
- 函数外首先定义全局变量
- 函数内修改全局变量
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash cc="aa" function fooc() { cc="bb" } echo "$cc" fooc echo -e "fooc return $? \n cc=$cc \n.."
|
1 2 3 4 5
| .. aa fooc return 0 cc=bb ..
|
2. 执行函数的shell,继承函数内部的打印输出
- 函数内部 包括打印语句
比如 echo 语句,不止echo,还包括,head、cat等等
- 执行函数并赋值给一个变量 ,注意 dd=
food
,函数名使用`` 包裹表示执行函数
- 而且通过下述例子可以看出,状态码是函数体内部返回的 状态码 5,也即该赋值操作,没改变变量$?
- 函数内部有多处打印输出,则通过该种方法赋值时,赋值为一个字符串
==会把多行输出都合并到一个字符串中,并且以一个空格做分割==
( 这里一个测试时很奇怪的点
原因是,以echo $dd
打印,结果以空格分割
和以echo "$dd"
打印结果以换行分割)
- 执行函数若不进行赋值操作,则函数内部的打印输出也会直接被继承到调用函数shell 的打印输出 顺序中
举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #!/bin/bash function food() { echo "11" echo "22 222" head -1 test.sh echo "33" return 5 } echo "directly print:" `food` dd=`food` echo -e "food return $? " echo $dd "start:${dd}end" echo -e "****************" echo -e "if dd is string, print the length of dd: ${#dd}" echo -e "if dd is array,print the length of array: ${#dd[@]}"
function fooe() { echo "11" echo "22 222" head -1 return_fuc_test.sh echo "33" return 5 }
fooe echo -e "fooe return $? "
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| directly print: 11 22 222 #!/bin/bash 33 food return 5 11 22 222 #!/bin/bash 33 start:11 22 222 #!/bin/bash 33end **************** if dd is string, print the length of dd: 24 if dd is array,print the length of array: 1 # 按数组来看,查询数组长度为1,所以函数返回值是一个字符串
11 22 222 #!/bin/bash 33 fooe return 5
|
总结
- 函数执行状态码,一般是用来判断 函数执行结果状态
- 第二种方式,获取函数返回值,如同一般编程中函数返回值使用
参考
- linux shell返回值方式及示例_51CTO博客_shell脚本返回值