bash函数和脚本的返回值
2017-12-07 本文已影响25人
CodingCode
函数返回值
函数的返回值是一个数字, 范围是[0 - 255], 每一个函数都有返回值,或者
- 由显式的return语句指定, 后面跟一个[0-255]之间的数字, 或者
- 如果没有return语句,那么最后一条语句的返回值作为函数的返回值.
举例子说明:
#!/bin/bash
function foo1() {
return 1
}
function foo2() {
ls *.sh
}
function foo3() {
ls *.ksh
}
foo1
echo "foo1 return $?"
foo2
echo "foo2 return $?"
foo3
echo "foo3 return $?"
- 函数foo1由显式的return语句指定返回1.
- 函数foo2没有return语句, 它将返回"ls *.sh"的返回值.
- 函数foo3没有return语句, 它将返回"ls *.ksh"的返回值.
如果当前目录下有.sh文件,而没有.ksh文件,那么会得到如下运行结果:
$ ./test.sh
foo1 return 1
test.sh
foo2 return 0
ls: cannot access *.ksh: No such file or directory
foo3 return 2
其中foo3 return 2这个2是"ls *.ksh"命令的返回值.
脚本的返回值
脚本的返回值和函数的返回值一样. 脚本的返回值也是一个数字, 范围是[0 - 255], 或者
- 由显式的exit语句指定, 后面跟一个[0-255]之间的数字, 或者
- 如果没有exit语句,那么最后一条命令的返回值作为脚本的返回值.
举例
$ cat t0.sh
#!/bin/bash
exit 0
$
$ cat t1.sh
#!/bin/bash
exit 1
$
$ cat t2.sh
#!/bin/bash
ls *.ksh
$
$ cat t.sh
#!/bin/bash
./t0.sh
echo "t0 return $?"
./t1.sh
echo "t1 return $?"
./t2.sh
echo "t2 return $?"
运行结果:
$ ./t.sh
t0 return 0
t1 return 1
ls: cannot access *.ksh: No such file or directory
t2 return 2
其中t2得返回值2就是最后一条命令"ls *.ksh"的返回值.
判断函数是否执行成功
有些时候我们需要判断一个函数是否成功, 来决定走不同的分支,
if funcall; then
...
else
...
fi
只要理解一点, 判断函数是否执行成功的依据是函数返回值是否为零, 是零表示成功, 非零表示失败. 看下面例子:
#!/bin/bash
function isOK1() {
return 0
}
function isOK2() {
return 100
}
if isOK1; then
echo "isOK1 return true"
else
echo "isOK1 return false"
fi
if isOK2; then
echo "isOK2 return true"
else
echo "isOK2 return false"
fi
运行结果如下:
$ ./test.sh
isOK1 return true
isOK2 return false
- 函数isOK1的返回值为0, bash认为调用成功.
- 函数isOK2的返回值为100, bash认为调用失败.
判断命令是否执行成功
和判断函数是否执行成功一样
注意
函数内return指令和exit指令的区别
- return只能在函数内部使用, 不能在函数外使用.
- exit指令可以在函数内,也可以在函数外使用.
- return从当前函数返回, 返回到调用者,继续往下执行.
- exit从当前函数退出, 并直接退出当前进程, 返回父进程.
- 注意是退出一个当前进程, 而不是退出整个调用链, 我们知道shell里面每一个脚本都是在一个独立的进程空间里面运行的, 所有exit命令只是退出exit命令所在脚本的进程, 然后从调用者脚本继续往下执行.