有时候在编写条件时,我需要代码什么都不做,例如,在这里,我想让BASH在$a
大于“10”时不做任何事,如果$a
小于“5”则打印“1”,否则,打印“2”:什么命令在BASH的条件中意味着“什么都不做”?
if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
echo "1"
else
echo "2"
fi
虽然这样做会产生错误。有一个命令什么都不做,哪个不会减慢我的脚本?
有时候在编写条件时,我需要代码什么都不做,例如,在这里,我想让BASH在$a
大于“10”时不做任何事,如果$a
小于“5”则打印“1”,否则,打印“2”:什么命令在BASH的条件中意味着“什么都不做”?
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
:
(冒号)
什么也不做超出扩大参数和执行重定向。返回状态为零。
你或许可以只使用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
如果你没有测试结果,只要涉及到脚本,'true'和'false'实际上是空操作的,但是原则上它们*可以*分支一些接受这个语法的shell,所以也许':'比较好。 – dmckee
这个问题被标记为bash。在bash中,“true”和“false”是内置的。对于较老的shell,'true','false',甚至':'可能是外部命令(尽管你可能会看到后者只在*非常旧的shell中)。 –
我更喜欢':'只是因为它更明确的意图是什么 –
虽然我不回答原来的问题concering无操作命令,许多(如果不是大多数)的问题时,人们可以“在这个分支我要做什么”认为可以通过简单地绕过重构逻辑,以便这个分支不会发生。
我试图通过使用有机磷农药例如
一筹莫展的时候,$ a是一个比“10”大给一般规则,打印“1”,如果$ a小于“5”,否则,打印“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当然更好,但我想给所有寻找如何无所事事的人一个通用的规则。)
有人可能想要禁止使用的一个原因是,最初构建代码的想法是人们会添加“稍后在此处添加内容”而不会产生无意的副作用。例如。如果将一个if-then-else-fi放在.bashrc中,如果你把'echo“放在这里”'它会破坏一些非登录用途(例如scp被破坏),只有空格/评论会导致运行时错误。 – Aphoid
教育,:是运营商运行“真实”。我非常喜欢像这样的情况,因为它更容易阅读。 – SaintHax
@SaintHax不,它不运行'true'。它内置在外壳中,什么都不做。 – Barmar
它是内置的shell(你是正确的),它返回true(状态0),就像true一样,并且它更难以阅读。 Bash是一种DevOps语言,如果':'是由我的团队中的某个人编写的,我会让他们改变它。 – SaintHax