有时在创建条件时,我需要代码不做任何事情,例如,在这里,我希望Bash在$a大于“10”时不做任何事情,如果$a小于“5”则打印“1”,否则打印“2”:
$a
if [ "$a" -ge 10 ] then elif [ "$a" -le 5 ] then echo "1" else echo "2" fi
但是这会产生一个错误。是否有一个命令将什么都不做,也不会减慢我的脚本?
你可能只需要使用true命令:
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作为一般条件可以应用于其他后续条件。
$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
(对于这个特定的例子,@Flimzys重组肯定更好,但我想为所有搜索如何无所事事的人提供一个通用规则。)