243

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

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

虽然这会出错。是否有一个命令什么都不做,也不会减慢我的脚本速度?

4

3 回答 3

438

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

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

bash 手册

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

于 2013-07-11T01:26:38.557 回答
55

您可能只使用以下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
于 2013-07-11T01:26:19.590 回答
11

尽管我没有回答关于 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 重组当然更好,但我想为所有寻找如何无所事事的人提供一个通用规则。)

于 2014-01-12T04:30:23.283 回答