![Bash(单行):如果第一次成功则执行第二个命令,如果不成功则执行第三个命令?](https://linux22.com/image/44988/Bash%EF%BC%88%E5%8D%95%E8%A1%8C%EF%BC%89%EF%BC%9A%E5%A6%82%E6%9E%9C%E7%AC%AC%E4%B8%80%E6%AC%A1%E6%88%90%E5%8A%9F%E5%88%99%E6%89%A7%E8%A1%8C%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%91%BD%E4%BB%A4%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%8D%E6%88%90%E5%8A%9F%E5%88%99%E6%89%A7%E8%A1%8C%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我想通过 SSH 依次执行两个命令。我没有交互式 shell。仅当第一个命令成功时才应执行第二个命令,但该行位于脚本内,因此如果第二个命令无法以这种方式执行,我希望得到一些用户友好的反馈。之后,脚本的其余部分应继续执行,因此exit
等 不是此处的选项。
我知道我可以使用布尔运算符&&
,例如,如果失败则foo && bar
阻止bar
执行,并且仅在失败时执行。然而,我对它们如何相互结合有点困惑。foo
bar || baz
baz
bar
把它们加起来:
(通过 SSH 执行,无需交互式 shell)
- 执行
foo
bar
仅在foo
成功时执行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'
(是的,这是单引号内的单个多行字符串。)