OR 之后执行多个 Bash 命令

And*_*alj 1 linux error-handling bash scripting

我正在编写一个 Bash 脚本来安装一些软件;有没有一种方法可以创建一个在 OR 之后执行多个命令的单行代码?基本上,我想要做的错误检查是这样的:

sudo apt-get install fortune || (echo "Installation failed" ; exit)
echo "Installation successful"
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了,但安装失败时它不会退出脚本,并且仍然输出“安装成功”。关于如何编辑此方法以使其发挥作用有什么想法吗?

che*_*ner 5

括号创建一个子 shell,这是exit命令退出的内容。您需要一个用大括号定义的命令组。

sudo apt-get install fortune || { echo "Installation failed" >&2; exit 1; }
Run Code Online (Sandbox Code Playgroud)

(请注意最后一个分号和大括号周围的空格;所有这些都很重要。)

为了使内容更具可读性,通常您定义一个函数来充当以下单个命令||

abort () { echo "Installation of $1 failed" >&2; exit 1; }

sudo apt-get install fortune || abort fortune
Run Code Online (Sandbox Code Playgroud)

  • @AndreasKralj,考虑 `die() { retval=$?; 回声“$*”>&2; 退出 $(( retval ? retval : 1 )); }` -- 因此,`foo || die "foo failed"` 将传递 `foo` 的退出状态,而 `$?` 为 0 的 `diewhatever` 将使用 1。 (2认同)
  • 如果您不再尝试过于冗长,这一切都会变得容易得多。`apt-get` 打印一条完全合理的错误消息,并且您不会通过编写“Installation of $1 failed”来添加太多信息。如果你只是省略它,你可以只写`sudo apt-get install fotune || exit`,并且 sudo 返回的值将由脚本返回。(带有你参数的“exit”与“exit $?”相同,如果你想明确地写“exit $?”)。 (2认同)