如何终止bash函数执行

时间:2018-01-31 11:54:09

标签: bash

我的const out = data.map(({ position: order, batches }) => { const logs = batches.map(({ batchNumber, ammount }) => { if (batchNumber) return { batchNumber, ammount }; return { ammount }; }); return { order, logs } }); 中有几个函数,我想在错误时终止整个“运行”。例如:

.bashrc

如果我在终端中输入function assert_env() { var_name=$1 if [ -z "${!var_name}" ]; then printf "Missing environment variable: $var_name\n" exit 1 fi } function my_test() { assert_env "abc" print $abc } 我想终止执行,但是这个脚本会关闭终端(正如预期的那样 - 我运行my_test)。

如何在不关闭当前终端的情况下终止执行?

编辑:更具体一点 - 我不想从exit 1返回,如果assert_env的条件不是my_test,我希望assert_env中的以下命令不被执行遇到过像C ++ assert

这样的东西

2 个答案:

答案 0 :(得分:1)

请注意exit返回指定给shell本身的退出代码,因此使用exit 1显然会退出当前的shell。您需要在此处使用return

只要考虑您的要求,只需使用函数assert_env中的退出代码来决定是否要运行更多语句。这里使用return将导致当前函数超出范围,并且返回给被调用者的代码可用于检查其成功/失败

function assert_env() {
    local ret_val=0; var_name=$1  

    if [ -z "${!var_name}" ]; then
        printf "Missing environment variable: $var_name\n"
        ret_val=1
    fi

    return ${ret_val}
}

现在使用它

function my_test() {
    if ! assert_env "abc"; then
        return
    fi
    # Or could be just written as assert_env "abc" || return
}

这样,如果assert_env返回0,则my_test中的if子句断言失败,其余代码将被执行。返回1时,条件成立,返回函数调用而不退出主scipt。

请注意,function关键字是非标准的,不符合POSIX,并且可能无法在shell中使用。如果你想让它变得可移植,只需删除关键字即可。

答案 1 :(得分:0)

我找到了一个解决方法 - 在子shell中执行函数内容

示例:

function assert_env()
{
    var_name=$1

    if [ -z "${!var_name}" ]; then
        printf "Missing environment variable: $var_name\n"
        exit 1
    fi
}

function my_test()
{
(
    printf "$1\n"

    assert_env "abc"

    printf $abc
)
}