在 Bash 中的条件中"do nothing"命令是什么意思?



有时在生成条件时,我需要代码什么都不做,例如,这里,当$a大于"10"时,我希望Bash什么都不干,如果$a小于"5",则打印"1",否则,打印"2":

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

不过这是一个错误。有没有一个命令不会做任何事情,也不会减慢我的脚本速度?

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

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

来自bash手册:

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

您可能只需要使用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

虽然我没有回答关于no-op命令的原始问题,但当人们认为"在这个分支中,我什么都不做"时,许多(如果不是大多数)问题都可以通过重组逻辑来绕过,这样这个分支就不会发生。

我试图通过使用操作系统示例给出一个一般规则

当$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重组当然更好,但我想给所有搜索如何无所事事的人一个通用规则。)

我使用而不是:,true,false

echo -n ""

它避免了终端中的空线

你也可以更简洁地说:

echo -n

相关内容

  • 没有找到相关文章

最新更新