在多行Bash脚本中使用&&和||

10
echo hello; echo hi

在脚本中,这与此相同:

echo hello
echo hi

我该如何对以下可能性执行相同的操作?

echo hello && echo hi
echo hello || echo hi

我认为我可以做到这一点:

echo hello && \
echo hi

echo hello || \
echo hi 

但这更或多或少是模仿多行脚本

那么正确的做法是什么?

编辑:我知道 && 和 || 的工作原理,我只是想知道如何在多行脚本中有效复制它们。


1
|| 只有在第一条语句返回失败时才执行第二条语句。 - jim mcnamara
4
在两个命令之间使用&&||操作符被称为复合表达式复合命令。这些操作符是在两侧命令之间进行测试构造的。&&表示只有在第一个成功时才执行第二个||表示只有在第一个失败时才执行第二个注意,在任何一种情况下都不需要在其后进行行连续 -- 它是隐含的。从您上面的代码中删除\\并确认。 - David C. Rankin
3
我不明白为什么这个问题被关闭,我认为它很清晰,并有一个公正的观点,现在我也想知道答案。 - phil294
在我的脚本文件中,我做了你认为可以做的事情,但没有使用\,它运行得很好。然后我能够为每个命令添加注释。 - Eric Majerus
我想我在这里找到了答案!https://superuser.com/a/1188001/1284856 - Jerry
显示剩余2条评论
2个回答

2
你可以使用 if
if echo hello; then
    echo hi
fi

if ! echo hello; then
    echo hi
fi

2

echo one && echo two会打印出one,如果返回结果为0,则也会打印出two。

echo one || echo two会打印出one,如果返回结果不为0,则也会打印出two。

您可以使用它来缩短if语句,像这样:

if [[ 1 -eq 2 ]]; then doStuff; fi缩短为

[[ 1 -eq 2 ]] && doStuff

另一个例子是我在Ubuntu机器上运行的startx脚本,我先更新,然后启动x。

sudo apt-get update && sudo apt-get -y upgrade && apt-get -y autoremove && startx

它将&&链接在一起(请记住,&&只是检查"管道"到其的命令是否以0退出),以使仅当最后一个命令没有错误地运行时才运行下一个命令。我这样做是因为如果某些原因使apt失败,我可以从终端解决它,而无需等待xorg完成操作。

编辑:

如果您想要将&&“展开”到更多行中,请使用:

commandToCheckReturnOf
if [[ $? -eq 0 ]]; then
    doStuff
fi

如果你需要使用“||”,那么:
commandToCheckReturnOf
if [[ $? -ne 0 ]]; then
    doStuff
fi

对于造成的误解,我感到抱歉。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Miati
这更像是伪代码。[[ 1 -eq 2 ]] 显然总是为假,而 doStuff 没有定义,但是尝试将一些东西插入到我的示例中,看看差异在哪里。例如,[[ 1 -eq 2 ]] || echo Hello 会给你什么结果? :-) - MeetTitan
2
如果您熟悉 $?,那么可以将 && 视为 if [[ $? -eq 0 ]]; then command; fi 的简写。而 || 则是 if [[ $? -ne 0 ]]; then command; fi。虽然它们并不完全相同,但足以帮助您理解这个概念。 - MeetTitan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接