如何在bash中退出功能


97

如果条件为真,如何在不终止整个脚本的情况下退出函数,只是返回到调用函数之前。

# Start script
Do scripty stuff here
Ok now lets call FUNCT
FUNCT
Here is A to come back to

function FUNCT {
  if [ blah is false ]; then
    exit the function and go up to A
  else
    keep running the function
  fi
}

Answers:


136

用:

return [n]

help return

返回:返回[n]

Return from a shell function.

Causes a function or sourced script to exit with the return value
specified by N.  If N is omitted, the return status is that of the
last command executed within the function or script.

Exit Status:
Returns N, or failure if the shell is not executing a function or script.

19
请注意,如果您set -e在脚本的顶部设置了您的脚本,并且您的return 1或除0以外的其他任何数字都已设置,则整个脚本将退出。
叶夫根尼·布里克曼

1
@YevgeniyBrikman仅当函数中的错误是意外错误时才为真。如果使用例如调用该函数,||则有可能返回非零代码,并且脚本仍继续执行。
Dan Passaro

1
@DanPassaro是的,肯定有可能的解决方案,但我只是想指出,需要特别注意set -e并返回非零值,因为过去让我感到惊讶。
Yevgeniy Brikman


2

如果您想从外部函数返回错误而不带错误,exit可以使用以下技巧:

do-something-complex() {
  # Using `return` here would only return from `fail`, not from `do-something-complex`.
  # Using `exit` would close the entire shell.
  # So we (ab)use a different feature. :)
  fail() { : "${__fail_fast:?$1}"; }

  nested-func() {
      try-this || fail "This didn't work"
      try-that || fail "That didn't work"
  }
  nested-func
}

尝试一下:

$ do-something-complex
try-this: command not found
bash: __fail_fast: This didn't work

这具有附加的好处/缺点,您可以选择关闭此功能:__fail_fast=x do-something-complex

请注意,这会使最外面的函数返回1。


您能否进一步解释内部功能fail,冒号在这里做什么?
布鲁克·洪

:是内置在bash操作符是一个“无操作”。它计算表达式,但不执行任何操作。我正在使用它来进行变量替换,如果未定义变量(显然不是),该替换将失败。
Elliot Cameron

谢谢。我可以将表达式替换为其他表达式以检查的输入参数do-something-complex吗?<code> checkPara(){如果[$ 1 -lt $ 2]; 然后回显$ 3; fi; } do-something-complex(){checkPara $#1“这里有些消息警告用户如何使用该功能。” 我将向do-something-complex用户显示一些消息,如果没有参数输入该函数,则立即返回。
布鲁克洪

是的,您可以执行类似的操作来checkPara使用我的fail函数退出整个函数堆栈。
艾略特·卡梅隆

看来不行。(PS:codeblock在stackoverflow的注释中不起作用)。之后一直运行checkPara
布鲁克洪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.