Як вийти з функції в 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, це правда, лише якщо помилка у функції несподівана. Якщо функція викликається з використанням, наприклад, ||тоді можна повернути ненульовий код, і при цьому сценарій продовжуватиме виконуватися.
Dan Passaro,

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

Якщо ви хочете повернутися із зовнішньої функції з помилкою без exiting, ви можете скористатися цим фокусом:

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, який не відповідає. Він оцінює вираз, але нічого з ним не робить. Я використовую його для заміни змінної, яка зазнає невдачі, якщо змінна не визначена, що, очевидно, не є.
Елліот Камерон,

Дякую. Чи можу я замінити вираз на інший вираз, щоб перевірити вхідний параметр do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; потім відлуння $ 3; fi; } do-something-complex () {checkPara $ # 1 "Тут з’являється повідомлення, щоб попередити користувача про те, як користуватися функцією." echo "yes"} </code> Я б do-something-complexпоказав користувачеві якесь повідомлення і негайно повернувся б, якщо до функції не подано жодного параметра.
Брук Хонг

Так, ви могли б зробити щось подібне, де checkParaвикористовували б мою failфункцію для виходу з цілого стеку функцій.
Елліот Камерон,

Здається, не працює. (PS: codeблок не працює в коментарі щодо stackoverflow). Це продовжує бігати за checkPara.
Брук
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.