什么命令意味着在Bash中有条件地“无所事事”?

时间:2013-07-11 01:24:37

标签: bash conditional noop

有时候在制作条件时,我需要代码什么也不做,例如,在这里,我希望Bash在$a大于“10”时什么都不做,如果$a是打印则为“1”小于“5”,否则,打印“2”:

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

这会产生错误。是否有一个命令什么都不做,也不会减慢我的脚本?

3 个答案:

答案 0 :(得分:272)

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

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

来自bash manual

  

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

答案 1 :(得分:31)

您可以使用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

答案 2 :(得分: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 restructuring肯定更好,但我想为所有搜索如何无所事事的人提供一般规则。)