Во-первых, напишите функции так, чтобы они возвращали ненулевой статус, если они терпят неудачу, ноль, если они успешны (на самом деле, вы должны делать это в любом случае в качестве общей хорошей практики).Примерно так:
function2() {
if some condition that uses $test_name fails; then
echo "test condition failed in function2" >&2 # Error messages should be sent to stderr
return 1
fi
# Code here will only be executed if the test succeeded
do_something || return 1
# Code here will only be executed if the test AND do_something both succeeded
do_something_optional # No error check here means it'll continue even if this fails
do_something_else || {
echo "do_something_else failed in function2" >&2
return 1
}
return 0 # This is actually optional. By default it'll return the status
# of the last command in the function, which must've succeeded
}
Обратите внимание, что вы можете смешивать стили здесь (if
против ||
против любого), как того требует ситуация.В общем, используйте наиболее понятный стиль, так как ваш самый большой враг - путаница в отношении того, что делает код.
Затем в основной функции вы можете проверить состояние выхода каждой подфункции и вернуться рано, если таковые имеются.fail:
main_function (){
do something to "$test_name" || return 1 # BTW, you should double-quote variable references
function2 "$test_name" || return 2 # optional: you can use different statuses for different problems
function3 "$test_name" || return 1
}
Если вам нужно пропустить конец основного цикла, вот где вы должны использовать continue
:
while true read -r line; do
if [[ ! "${line}" =~ ^# && ! -z "${line}" ]]; then
test_name=$line
main_function "$test_name" || continue
echo "Finished processing: $line" >&2 # Non-error status messages also go to stderr
fi
done < "$OS_LIST"