Как бы вы вышли из функции, если условие истинно, не убивая весь скрипт, просто вернитесь к тому, что вы вызывали функцию.
пример
# 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
}
set -e
установили вверху вашего скрипта и вашеreturn 1
или любое другое число, кроме 0, весь ваш скрипт завершится.||
тогда можно вернуть ненулевой код и продолжить выполнение скрипта.set -e
и возвращать ненулевые значения, поскольку в прошлом это застало меня врасплох.Используйте
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 }
источник
Если вы хотите вернуться из внешней функции с ошибкой, не
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 оператор, который не работает. Он оценивает выражение, но ничего с ним не делает. Я использую его для подстановки переменных, которая не удастся, если переменная не определена, что, очевидно, не так.do-something-complex
? <code> checkPara () {если [$ 1 -lt $ 2]; затем echo $ 3; fi; } do-something-complex () {checkPara $ # 1 "Здесь какое-то сообщение, предупреждающее пользователя, как использовать функцию." echo "yes"} </code> Я быdo-something-complex
показал пользователю какое-нибудь сообщение и немедленно вернулся бы, если в функцию не передан параметр.checkPara
бы использовали моюfail
функцию для выхода из всего стека функций.code
блок не работает в комментарии к stackoverflow). Он продолжает бежать заcheckPara
.