在Bash条件语句中表示“什么都不做”的命令是什么?

278

有时在编写条件语句时,我需要让代码什么也不做。例如,在这里,当$a大于"10"时,我希望Bash什么也不做;如果$a小于"5",则打印"1",否则打印"2":

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

然而这会导致错误。有没有一种命令可以什么都不做,同时又不会减慢我的脚本速度?


echo $[a<=5?1:2] 这是一个简洁的三元运算符,忽略了对 a>=10 的任何测试。 - roblogic
4个回答

519

在shell中,无操作命令是:(冒号)。

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

来自bash手册

:(一个冒号)
除了展开参数和执行重定向之外,不执行任何操作。返回值为零。


5
不,它并不会运行“true”。它是内置于shell中的,并且不起作用。 - Barmar
1
它是内置的shell(你是正确的),它返回true(状态0),就像true一样,但它更难读。Bash是一种DevOps语言,如果我的团队中有人写了:,我会让他们改变它。 - SaintHax
4
如果有人在非条件语境中使用了 true,我会让他们更改。 if true 是可以的,但 then true 看起来不对。 - Barmar
4
当然,你可以简单地重写代码,使用if ! condition; then do something; fi代替if condition; then :; else do something; fi - Barmar
2
等待ping成功的命令:while ! ping -c 1 主机名; do : done。@kingsjester - Barmar
显示剩余4条评论

61

您可以直接使用 true 命令:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

在你的例子中(但不一定适用于所有情况),另一种选择是重新排列if/else语句:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi

8
如果您不对结果进行truefalse测试,则在脚本方面实际上它们都是无操作的,但原则上它们可能在一些接受此语法的shell中分叉,因此使用 : 可能更好。 - dmckee --- ex-moderator kitten
3
这个问题被标记为bash。在bash中,truefalse是内置命令。对于较旧的shell,truefalse甚至是:可能是外部命令(尽管您可能只在非常老的shell中看到后者)。 - Keith Thompson
8
我更喜欢使用“:`”,因为这样更明确表达了意图。 - Freedom_Ben
1
结果false可能不是无操作,因为如果使用set -e(非零退出),那么false将导致脚本立即退出。 true是更好的无操作。 :是真正的无操作,但我必须承认它很难读懂,而且我已经编写bash程序30年了,我也不知道它... - Mark Lakata

12
虽然我没有回答关于空操作命令的原始问题,但是许多(如果不是大多数)情况下,当一个人认为“在这个分支中我什么也不需要做”时,可以通过简单地重构逻辑来避免这种分支发生。
我试着用操作者的例子给出一个通用规则

当$a大于"10"时不执行任何操作,如果$a小于"5",则打印"1",否则打印"2"

我们必须避免一个分支,其中$a超过了10,因此,$a < 10可以作为一般条件应用于其他所有条件。
一般来说,当你说在X时什么也不做时,那么将其重新表述为避免X发生的分支。通常,您可以通过否定X并将其应用于所有其他条件来实现避免。
因此,使用应用规则的操作者示例可能被重组为:
if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

只是以上内容的一种变化,将所有内容都包含在$a < 10条件中:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(对于这个具体的例子,@Flimzys restructuring 肯定更好,但我想为所有搜索如何什么都不做的人提供一个通用规则。)

(对于这个特定的例子,@Flimzys的重构显然更好,但我希望给那些搜索如何什么都不做的人提供一个通用规则。)


7
当初编写代码时,有些人可能希望使用 no-op(空操作符)来避免无意中产生副作用,因为他们打算在稍后的时间添加新内容。例如,如果你在 .bashrc 中添加了 if-then-else-fi 语句并且加入 echo "put stuff here" ,那么会破坏一些非登录使用场景(如 scp),只有空格或注释会导致运行时错误。 - Aphoid
1
此外,就个人而言,我更喜欢编写更“人性化”的代码。通常可以重构代码以使其更简洁甚至更高效。但是当这不是关键时,我更喜欢我的代码对于随后的任何开发人员来说更易读。(我也喜欢注释我的代码。) - osullic

0

我使用的是冒号、true和false的替代方式

echo -n ""

它避免了终端中的空行。

您还可以更简洁地执行:

echo -n

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