协慌网

登录 贡献 社区

在 Bash 脚本中,如果发生某种情况,如何退出整个脚本?

我正在 Bash 中编写脚本来测试一些代码。但是,如果首先编译代码失败,则运行测试似乎很愚蠢,在这种情况下,我将中止测试。

有没有一种方法可以在不将整个脚本包装在 while 循环内并使用 break 的情况下做到这一点?像 dun dun dun goto 之类的东西?

答案

尝试以下语句:

exit 1

1替换为适当的错误代码。另请参阅具有特殊含义的退出代码

使用set -e

#!/bin/bash

set -e

/bin/command-that-fails
/bin/command-that-fails2

脚本将在失败的第一行之后终止(返回非零退出代码)。在这种情况下, command-that-fails2将不会运行。

如果要检查每个命令的返回状态,则脚本将如下所示:

#!/bin/bash

# I'm assuming you're using make

cd /project-dir
make
if [[ $? -ne 0 ]] ; then
    exit 1
fi

cd /project-dir2
make
if [[ $? -ne 0 ]] ; then
    exit 1
fi

使用set -e它将看起来像:

#!/bin/bash

set -e

cd /project-dir
make

cd /project-dir2
make

任何失败的命令都会导致整个脚本失败,并返回退出状态,您可以使用$ 检查该退出状态? 。如果您的脚本很长,或者您正在构建很多东西,那么在各处添加返回状态检查将变得非常难看。

SysOps 的一个人曾经教过我三指爪技术:

yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }

这些功能是 * NIX OS 和 shell 健壮的。将它们放在脚本的开头(bash 或其他方式), try()您的语句和代码。

解释

(根据飞羊的评论)。

  • yell :将脚本名称和所有参数打印到stderr
    • $0是脚本的路径;
    • $*都是自变量。
    • >&2表示>将标准输出重定向到&管道2管道1本身就是stdout
  • die作用与yell相同,但退出状态为非 0 退出状态,表示 “失败”。
  • try使用|| (布尔值OR ),仅在左侧失败时才评估右侧。
    • $@再次是所有参数,但是不同