在Bash中,什么命令意味着“什么都不做”?


195

有时,在创建条件语句时,我需要代码不执行任何操作,例如,在这里,我希望Bash在$a大于“ 10”时不执行任何操作,如果$a小于“ 5”,则打印“ 1”,否则,请打印“ 2”:

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

但是,这会导致错误。有没有什么用的命令也不会减慢我的脚本的速度吗?

Answers:


362

Shell中的no-op命令是:(冒号)。

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

bash手册

:(冒号)
除了扩展参数和执行重定向之外,什么也不做。返回状态为零。


4
@SaintHax不,它没有运行true。它内置在外壳中,什么也不做。
巴马尔(Barmar)'17

1
它是内置的shell(您是对的),就像true一样,它返回true(状态0),并且更难以阅读。Bash是一种DevOps语言,如果:是由我们团队中的某人编写的,那么我会请他们进行更改。
SaintHax '17

3
@SaintHax如果有人true在无条件的上下文中使用,我希望他们进行更改。if true很好,then true似乎错了。
巴马尔(Barmar)'17

1
当然,您可以简单地重写要使用的代码,if ! condition; then do something; fi而不是if condition; then :; else do something; fi
巴马尔(Barmar)'17年

我同意你的看法。可以使用if / elif / else使用复合条件编写此示例,效果会更好。
圣哈克斯

38

您可能只需要使用以下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
如果您不同时测试结果,true并且false就脚本而言实际上是无操作的,则原则上它们可以放入接受此语法的一些shell中,所以也许:更好。
dmckee ---前主持人小猫,

3
这个问题被标记为bash。在bash中,true并且false是内置的。对于较旧的贝壳,truefalse,甚至:可能是外部命令(虽然你可能只看到后者旧壳)。
基思·汤普森

7
我更喜欢:仅仅因为它的意图是更明确的
Freedom_Ben 2014年

9

尽管我没有回答有关no-op命令的原始问题,但是可以通过简单地重组逻辑来绕过许多(如果不是大多数)问题,当人们认为“在该分支中我什么都不要做”时,可以绕过该问题,从而使该分支获胜不会发生。

我尝试通过使用OPs示例给出一般规则

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

我们必须避免分支$a大于10的分支,这样$a < 10一般条件就可以应用于以下条件中的每个其他条件。

一般而言,当您说X不执行任何操作时,请将其改写为避免在X处出现分支。通常,您可以通过简单地将X取反并将其应用于所有其他条件来使避免发生。

因此,应用了规则的OP示例可以重组为:

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的重组当然更好,但是我想为所有寻求不采取任何措施的人们提供一个通用规则。)


5
某人可能希望不进行操作的一个原因是,在最初构建代码时会想到一个想法,即可以在以后添加“在此处添加一些内容”而不会产生无意的副作用。例如,如果将一个if-then-else-fi放在.bashrc中,则如果您放置 echo "put stuff here"它会破坏一些非登录用途(例如scp被破坏),只有空格/注释会导致运行时错误。
恐惧
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.