Как выйти из функции в bash

101

Как бы вы вышли из функции, если условие истинно, не убивая весь скрипт, просто вернитесь к тому, что вы вызывали функцию.

пример

# 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
}
Атомиклан
источник

Ответы:

139

Использование:

return [n]

Из help return

return : 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.
мохит
источник
20
Обратите внимание, что если вы set -eустановили вверху вашего скрипта и ваше return 1или любое другое число, кроме 0, весь ваш скрипт завершится.
Евгений Брикман
1
@YevgeniyBrikman, это правда, только если ошибка в функции неожиданная. Если функция вызывается с использованием, например, ||тогда можно вернуть ненулевой код и продолжить выполнение скрипта.
Дэн Пассаро
1
@DanPassaro Да, определенно есть возможные решения, но я просто хотел отметить, что нужно проявлять особую осторожность set -eи возвращать ненулевые значения, поскольку в прошлом это застало меня врасплох.
Евгений Брикман
21

Используйте returnоператор:

function FUNCT {
  if [ blah is false ]; then
    return 1 # or return 0, or even you can omit the argument.
  else
    keep running the function
  fi
}
Неманья Борич
источник
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, что здесь делает двоеточие?
Hong
Это :встроенный в bash оператор, который не работает. Он оценивает выражение, но ничего с ним не делает. Я использую его для подстановки переменных, которая не удастся, если переменная не определена, что, очевидно, не так.
Эллиот Кэмерон
Спасибо. Могу ли я заменить это выражение другим выражением, чтобы проверить входной параметр do-something-complex? <code> checkPara () {если [$ 1 -lt $ 2]; затем echo $ 3; fi; } do-something-complex () {checkPara $ # 1 "Здесь какое-то сообщение, предупреждающее пользователя, как использовать функцию." echo "yes"} </code> Я бы do-something-complexпоказал пользователю какое-нибудь сообщение и немедленно вернулся бы, если в функцию не передан параметр.
Hong
Да, вы могли бы сделать что-то подобное, где checkParaбы использовали мою failфункцию для выхода из всего стека функций.
Эллиот Кэмерон
Вроде не работает. (PS: codeблок не работает в комментарии к stackoverflow). Он продолжает бежать за checkPara.
Hong