当前位置: 首页 > 面试题库 >

了解Bash短路

谯翔
2023-03-14
问题内容

首先,我不是Bash专业人士。几个月前,我发现如果同时使用花括号&&||短路运算符,那么如果第一个语句以真实值退出,则如果true块中的最后一个语句退出非零,则fail块也将被执行。像这样:

returnNumber 0 && {
    echo 'OK'
    returnNumber 1
} || {
    echo 'NG'
}

将输出:

OK
NG

因此,我为此寻找了最简单的解决方案,并提出了以下解决方案:

returnNumber 0 && {
    echo 'OK'
    returnNumber 1
    :
} || {
    echo 'NG'
}

我知道,省略内置的冒号很容易,但这是否是解决方法的正确方法?


问题答案:

这实际上是一个非常常见的Bash陷阱。这
不是 错误。

returnNumber 0计算结果为true,因此也对第二个块(由逻辑和联接&&)也进行了计算,以确保的结果first && second仍然为true。
第二个块输出,OK但求值为假,因此现在的结果first && second为假。这意味着还必须对第三部分(由逻辑或相连||)进行评估,并使其NG显示出来。

而不是依赖于&&||,您应该使用以下if语句:

if returnNumber 0; then
    echo 'OK'
    returnNumber 1
else
    echo 'NG'
fi

tl; dr:x && y || zy可以返回非零退出状态时不使用。



 类似资料:
  • 因此,我最近一直在使用NLP,但除了/test/这样非常简单的匹配之外,我在使用它们的regex语法时遇到了麻烦。我正在寻找的最终游戏是匹配在其内容的某个地方包含特定单词的短语。我试图建模的语音模式是非常结构化的,但因为人类的语音是可变的,短语可以以无数种方式开始,但只要短语包含特定的关键词,我就想计算它。作为一个例子,我试图用TokensRegex建模的regex是: 对我来说,从他们的文档中看

  • 我有一个短代码(outputURL),用于将值输出到URL中。该值从短代码(valueURL)中检索。valueURL输出是文本包装在div中: 我只需要textForURL值,不包括div标记。到目前为止,我只能输出div标记和文本,而不能输出纯文本的干净版本。 这是我的简码函数: 我进行了研究,并能够将其整合在一起,但我不确定我是否朝着正确执行的方向前进。任何能帮助我实现目标的人都将不胜感激。

  • 我使用广度优先搜索构建了一个8个谜题解算器。现在我想修改代码以使用启发式。如果有人能回答以下两个问题,我将不胜感激: 可解性 我们如何决定一个8字谜是否是可解的?(给定起始状态和目标状态)这是维基百科所说的: 不变量是所有16个方块排列的奇偶校验加上右下角空方块的出租车距离(行数加列数)的奇偶校验。 不幸的是,我不明白这意味着什么。理解起来有点复杂。有人能用更简单的语言解释一下吗? 最短解决方案

  • 问题内容: 我不太清楚该在哪里抛出该异常。 例如,我正在实现接口,并且不希望任何人调用该方法: Future#get(long,TimeUnit)。 所以,我可以扔吗? 事情是方法的规范并没有说明抛出异常。反过来,例外 抛出以指示不支持请求的操作。 类UnsupportedOperationException 我的意思是,如果您不希望调用它,通常会抛出它,否则可能会因为不是所有方法都已实现而被认为

  • 问题内容: 我试图了解Go中的并发性。特别是,我编写了以下线程不安全程序: 我认识到我应该使用渠道来防止与发生竞争,但这不是重点。程序打印,然后似乎永远循环(不再打印任何内容)。我希望它能打印出无限的数字列表,可能由于竞态条件而跳过某些数字并重复其他数字(或更糟的是,在更新数字时打印数字)。 我的问题是:为什么程序只打印一行? 只是要清楚一点:对于这个玩具示例,我不是故意使用渠道。 问题答案: 关

  • 问题内容: 我了解这是一个框架;甚至还有一个开源的跨平台游戏开发库。我转到libgdx主页,并按照视频教程中的说明进行操作。正确设置项目后,我可以在多个受支持的平台上运行默认的my- gdx-game项目。太好了,花花公子…现在呢? 我一直在搜索论坛,Wiki,javadocs和许多其他站点,以寻找体面的简单操作方法。不幸的是,我找不到任何东西,那里的大多数帮助都假设您对这个库有一些基本的了解。