Bash(单行):如果第一次成功则执行第二个命令,如果不成功则执行第三个命令?

Bash(单行):如果第一次成功则执行第二个命令,如果不成功则执行第三个命令?

我想通过 SSH 依次执行两个命令。我没有交互式 shell。仅当第一个命令成功时才应执行第二个命令,但该行位于脚本内,因此如果第二个命令无法以这种方式执行,我希望得到一些用户友好的反馈。之后,脚本的其余部分应继续执行,因此exit等 不是此处的选项。

我知道我可以使用布尔运算符&&,例如,如果失败则foo && bar阻止bar执行,并且仅在失败时执行。然而,我对它们如何相互结合有点困惑。foobar || bazbazbar

把它们加起来:

(通过 SSH 执行,无需交互式 shell)

  1. 执行foo
  2. bar仅在foo成功时执行
  3. baz仅在foo失败并阻止执行时执行bar

ssh user@host "foo && bar || baz"

这是执行我刚才描述的操作的正确方法吗?

答案1

使用您的示例foo && bar || baz将执行baz如果bar 或者 foo失败。根据您的描述,这不是您想要的。您可以使用以下if语句来实现您的目标:

if foo; then
    bar
else
    baz
fi

或者,如果您希望将其写在一行上:

if foo; then bar; else baz; fi

答案2

命令中提供了 shell 脚本的完整语法ssh。 (这些命令由远程帐户的默认 shell 执行;我们在此假设它是sh兼容的。)

复合命令必须加引号。虽然您使用双引号是正确的,但我建议使用单引号,因为它们保护所有 shell 特殊字符;如果您想在远程命令中使用重要的 shell 结构,这一点可能很重要。

既然这样,这里有一种方法可以做你想做的事:

ssh user@host 'foo && bar || { echo foo failed >&2; baz; }'

您还可以使用任意复杂的条件:

ssh user@host '
    if foo; then
         bar
    else
        echo foo failed >&2
        baz
    fi'

(是的,这是单引号内的单个多行字符串。)

相关内容