尽管有 250 多个赞成的答案,你为什么要关心我说的话
不是0 = true 和1 = false。它是:零表示没有失败(成功),非零表示失败(N型)。
虽然selected answer 在技术上是“正确的”请不要将return 1** 放入您的代码中以表示错误。它会产生一些不幸的副作用。
- 经验丰富的开发人员会将您视为业余爱好者(原因如下)。
- 经验丰富的开发人员不会这样做(原因如下)。
- 容易出错。
- 即使是经验丰富的开发人员也可能将 0 和 1 分别误认为是 false 和 true(原因如上所述)。
- 它需要(或将鼓励)无关紧要和荒谬的 cmets。
- 它实际上不如隐式返回状态有用。
学习一些 bash
bash manual 说(强调我的)
返回 [n]
使 shell 函数停止执行并将值 n 返回给它的调用者。 如果不提供n,则返回值是函数中最后执行的命令的退出状态。
因此,我们不必使用 0 和 1 来表示真假。他们这样做的事实本质上是微不足道的知识,仅对调试代码、面试问题和激发新手的头脑有用。
bash 手册also says
否则函数的返回状态是最后执行的命令的退出状态
bash 手册also says
($?) 扩展到最近执行的前台管道的退出状态。
哇,等等。管道?让我们再turn to the bash manual 一次。
管道是由控制运算符“|”或“|&”之一分隔的一个或多个命令的序列。
是的。他们说 1 个命令是一个管道。因此,所有这 3 个引用都在说同样的事情。
我的回答
所以,虽然@Kambus demonstrated 有这么简单的功能,但根本不需要return。我想
与大多数阅读本文的人的需求相比,这简直是不切实际的简单。
为什么是return?
如果一个函数要返回其最后一个命令的退出状态,为什么还要使用return?因为它会导致函数停止执行。
多条件下停止执行
01 function i_should(){
02 uname="$(uname -a)"
03
04 [[ "$uname" =~ Darwin ]] && return
05
06 if [[ "$uname" =~ Ubuntu ]]; then
07 release="$(lsb_release -a)"
08 [[ "$release" =~ LTS ]]
09 return
10 fi
11
12 false
13 }
14
15 function do_it(){
16 echo "Hello, old friend."
17 }
18
19 if i_should; then
20 do_it
21 fi
我们这里有...
04 行是一个显式[-ish] 返回 true,因为 && 的 RHS 只有在 LHS 为 true 时才会执行
09 行返回与08 行状态匹配的真或假
13 行返回 false,因为12 行
(是的,这可以打高尔夫球,但整个例子都是人为的。)
另一种常见的模式
# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
echo "some_command failed"
fi
# Do this...
some_command
status=$?
if ! $(exit $status); then
echo "some_command failed"
fi
注意设置status 变量如何揭开$? 的含义。 (当然你知道$? 是什么意思,但是比你知识少的人总有一天会用谷歌搜索它。除非你的代码在进行高频交易,否则show some love,设置变量。)但真正的收获是可以大声读出“如果不存在状态”或相反的“如果退出状态”并解释其含义。 但是,最后一个可能有点过于雄心勃勃,因为看到 exit 这个词可能会让您认为它正在退出脚本,而实际上它正在退出 $(...) 子shell。
** 如果你绝对坚持使用return 1 来表示false,我建议你至少使用return 255 来代替。这将导致您未来的自己或任何其他必须维护您的代码的开发人员质疑“为什么是 255?”然后他们至少会注意并有更好的机会避免错误。