2013-07-11 103 views
104

有时候在编写条件时,我需要代码什么都不做,例如,在这里,我想让BASH在$a大于“10”时不做任何事,如果$a小于“5”则打印“1”,否则,打印“2”:什么命令在BASH的条件中意味着“什么都不做”?

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

虽然这样做会产生错误。有一个命令什么都不做,哪个不会减慢我的脚本?

回答

207

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

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

bash manual

:(冒号)
什么也不做超出扩大参数和执行重定向。返回状态为零。

+0

教育,:是运营商运行“真实”。我非常喜欢像这样的情况,因为它更容易阅读。 – SaintHax

+1

@SaintHax不,它不运行'true'。它内置在外壳中,什么都不做。 – Barmar

+1

它是内置的shell(你是正确的),它返回true(状态0),就像true一样,并且它更难以阅读。 Bash是一种DevOps语言,如果':'是由我的团队中的某个人编写的,我会让他们改变它。 – SaintHax

28

你或许可以只使用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 
+7

如果你没有测试结果,只要涉及到脚本,'true'和'false'实际上是空操作的,但是原则上它们*可以*分支一些接受这个语法的shell,所以也许':'比较好。 – dmckee

+2

这个问题被标记为bash。在bash中,“true”和“false”是内置的。对于较老的shell,'true','false',甚至':'可能是外部命令(尽管你可能会看到后者只在*非常旧的shell中)。 –

+4

我更喜欢':'只是因为它更明确的意图是什么 –

9

虽然我不回答原来的问题concering无操作命令,许多(如果不是大多数)的问题时,人们可以“在这个分支我要做什么”认为可以通过简单地绕过重构逻辑,以便这个分支不会发生。

我试图通过使用有机磷农药例如

一筹莫展的时候,$ a是一个比“10”大给一般规则,打印“1”,如果$ a小于“5”,否则,打印“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 restructuring当然更好,但我想给所有寻找如何无所事事的人一个通用的规则。)

+0

有人可能想要禁止使用的一个原因是,最初构建代码的想法是人们会添加“稍后在此处添加内容”而不会产生无意的副作用。例如。如果将一个if-then-else-fi放在.bashrc中,如果你把'echo“放在这里”'它会破坏一些非登录用途(例如scp被破坏),只有空格/评论会导致运行时错误。 – Aphoid