有时在制作条件句时,我需要代码不做任何事情,例如,在这里,我想让Bash在$a大于“10”时不做任何事情,如果$a小于“5”则打印“1”,否则打印“2”:

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

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


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

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

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

来自bash手册:

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


虽然我没有回答最初关于no-op命令的问题,但当人们可能认为“在这个分支中我必须什么都不做”时,许多(如果不是大多数)问题都可以通过简单地重新构造逻辑来绕过,这样就不会出现这个分支。

我试图用OPs的例子来给出一个一般的规则

当$a大于"10"时什么都不做,如果$a小于"5"则输出"1",否则则输出"2"

我们必须避免$a大于10的分支,因此$a < 10作为一般条件可以应用于其他条件。

一般来说,当您说在X时什么都不做时,那么重新措辞为避免X处的分支。通常您可以通过简单地否定X并将其应用于所有其他条件来实现避免。

因此,应用规则的OPs示例可以被重新构造为:

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

(对于这个具体的例子,@ fllimzys的重组肯定更好,但我想给所有搜索如何无所事事的人一个一般规则。)