编写 bash 脚本时与 && 等价的是什么?

Mik*_*e B 31 scripting bash centos

如果这是一个重复的问题,我提前道歉。在问这里之前,我确实努力搜索/检查。

我很乐意写这样的单行代码:

foocommand && foocommand2 && foocommand3
Run Code Online (Sandbox Code Playgroud)

这个想法是,如果前一个命令“成功”,我只希望后续命令运行。

我正在编写一个有点冗长的脚本,这个单行代码是不可行的,因为它看起来像是一大块令人困惑的代码。

我想在脚本中将命令隔开并在它们之间写注释。我怎样才能做到这一点,并且在那里仍然有相当于 && 的东西?

cho*_*oba 39

您可以将shebang行更改为

#!/bin/bash -e
Run Code Online (Sandbox Code Playgroud)

发生任何错误后,脚本将停止。

  • 不幸的是,有许多标准实用程序不遵循通常的退出状态约定,因此 `-e` 可能会出现错误行为。例如,您可能不希望每次“区分”两个不同文件时脚本都终止。当然,您可以通过附加 `|| 来解决这个问题。true`(或者可能是 `|| [ $? = 1 ]`)到这样的命令,但是 OP 提到了一个“其他人”必须阅读这个脚本,并说“其他人”可能不会习惯应付`-e`。 (7认同)
  • 我曾经把`-e`放在she-bang上,直到我公司的一位管理员一直用`bash myscript.sh`启动我的脚本,所以它忽略了`-e`。现在我所有的脚本在第二行都有一个 `set -e`。 (4认同)

sch*_*iba 23

你可以这样做:

#!/bin/sh
ls -lh &&
    # This is a comment
    echo 'Wicked, it works!'
Run Code Online (Sandbox Code Playgroud)

我希望我理解你的要求是正确的。


tri*_*eee 19

如果你不喜欢这个set -e想法,也许你可以颠倒逻辑。

foocommand || exit 1
foocommand2 || exit 2
foocommand3 || exit 3
Run Code Online (Sandbox Code Playgroud)

更有exit用的是,用一些东西替换以打印有用的错误消息,然后退出。当然,在函数内部,您想要return代替exit.

  • 或者`foocommand || 如果非零,退出`以`foocommand`的退出状态退出。 (11认同)

lmc*_*als 9

您可以改用if else fi块。

if foocommand; then

  # some comments

  if foocommand2; then

    # more comments

    foocommand3
  fi
fi
Run Code Online (Sandbox Code Playgroud)

它更具可读性。

或者,您可以使用\将大 1 衬里分成几行

foocommand && \
  # some comment
  foocommand2 && \
    # more comment
    foocommand3
Run Code Online (Sandbox Code Playgroud)

但这当然会让未经训练的眼睛感到困惑。

  • 我不认为 ``\`` 在那里是必要的。 (4认同)

liv*_*ato 5

您可以考虑使用嵌套if语句。其他选择是使用 curl 来分组{ true && echo hi; } || echo huh

更新 1:

这是一个没有换行符/注释的示例:

{ { false && echo "inner true"; } && { echo "inner true" && true; } || { echo "inner false" && false; } || echo "outter false"; }
Run Code Online (Sandbox Code Playgroud)