使用 if 语句和函数调用编写构建脚本

And*_*ita 6 bash

我的构建/部署脚本的行为与我预期的不一样。如果克隆或构建失败,它仍然会继续并调用重新启动。我怀疑它是因为我返回 0,但是如果我想从内部命令返回结果我应该怎么写,并且在“克隆”中我想只有在克隆成功时才移动到克隆的文件夹中。你会如何改进这个脚本?

function clone {
    git clone /volume1/repos/project.git
    cd project
    return 0
}

function build {
    docker build -t project .
    return 0
}

function cleanup {
    ...
}

function restart {
    ...
    docker run ...
}

trap cleanup EXIT

if clone && build; then
    restart
    exit 0
else
    echo Failed...
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

ter*_*don 13

是的,正如您所指出的,由于您的函数总是返回 a0它总是会返回成功。无论发生了什么。最简单的解决方案是让您的函数根本不返回任何内容:

function clone {
    git clone /volume1/repos/project.git
    cd project
}

function build {
    docker build -t project .
}
Run Code Online (Sandbox Code Playgroud)

然后,它将返回上次运行命令的退出状态(来自man bash):

执行时,函数的退出状态是函数体中执行的最后一个命令的退出状态。

当然,由于您的clone函数的最后一个命令是cd,这意味着如果git clone失败但cd project成功,您的函数仍然会返回成功。为了避免这种情况,您可以将 git 命令的退出状态保存在一个变量中,然后让您的函数返回该变量:

function clone {
    git clone /volume1/repos/project.git
    out=$?
    cd project
    return $out
}
Run Code Online (Sandbox Code Playgroud)

或者,也许更好:

function clone {
    git clone /volume1/repos/project.git && cd project
}
Run Code Online (Sandbox Code Playgroud)

通过组合命令,如果其中一个失败,您的函数将返回失败。