Shell函数返回值详解

shell脚本中,执行函数

通常来说函数返回值有两类

1. 函数执行状态码

我更愿意称之为函数执行状态码

标识函数是否执行成功,返回值只能是整数 ,在0-255之间,0表示成功,其他值表示失败

  • 函数内,显示使用return 语句,指定 函数返回值,(0-255)

  • 不显示使用return 语句,会将最后一条命令运行结果状态作为返回值

  • 获取该状态码,需要在函数执行后,立即从 $? 变量获取 ,因为该变量只显示最后命令的退出状态

  • $? 仅显示最后命令的退出状态,0表示没有错误,其他表示有错误;

举例

  1. return 整数 0-255,获取为正常状态码
  2. return 字符串,报错,test.sh: line 11: return: xyz: numeric argument required
  3. return 整数大于255,返回值 为 整数 取模256 ,如下例 64789 % 256 = 21
  4. 不显示使用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. 函数内修改全局变量
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,继承函数内部的打印输出

  1. 函数内部 包括打印语句
    比如 echo 语句,不止echo,还包括,head、cat等等
  2. 执行函数并赋值给一个变量 ,注意 dd=food,函数名使用`` 包裹表示执行函数
    • 而且通过下述例子可以看出,状态码是函数体内部返回的 状态码 5,也即该赋值操作,没改变变量$?
    • 函数内部有多处打印输出,则通过该种方法赋值时,赋值为一个字符串
      ==会把多行输出都合并到一个字符串中,并且以一个空格做分割==
      ( 这里一个测试时很奇怪的点
      原因是,以echo $dd 打印,结果以空格分割
      和以echo "$dd" 打印结果以换行分割)
  3. 执行函数若不进行赋值操作,则函数内部的打印输出也会直接被继承到调用函数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

总结

  1. 函数执行状态码,一般是用来判断 函数执行结果状态
  2. 第二种方式,获取函数返回值,如同一般编程中函数返回值使用

参考

  1. linux shell返回值方式及示例_51CTO博客_shell脚本返回值