据我了解,解释器逐行运行代码;但我发现我的推理可能是错误的。如果在本示例中第一if
行返回 true,则程序是否知道跳到fi
后面echo "APPROVED"
(并且它是否知道fi
在哪一行?)或者是否仍需要一些时间来检查下一行,并且在它们出现时不执行它们里面一个elif
或else
?
if [ $AVERAGE -ge "6" ]
then
echo "APPROVED"
# Does shell know how to directly get from here /\...
elif [ $AVERAGE -lt "2" ]
then
echo "FAILED"
else
echo "RETAKE TEST"
# ... To here? \/
fi
谢谢你!
答案1
正如 Michael Horner 指出的那样,shell 必须首先解析整个命令,因为如果它位于管道中或处于后台,则会影响命令的执行。 shell 执行的任何命令都是如此,如果您在交互式提示符下编写多行 shell 命令,它会执行此操作,这一点非常明显,因为它会在执行命令之前等待您完成该命令。
shell 将正确执行每个条件,并在达到条件为真时停止。它不会执行进一步的 elif 条件。 POSIX 明确规定了 Unix shell 的行为。
shell 是否进行优化以使运行速度更快或更有效是实现质量问题。小型 shell(例如 busybox 的 shell)可能更愿意以牺牲少量速度为代价而尽可能小,而其他 shell 可能更愿意进行更多优化。
一般来说,shell 脚本编写并不是一种非常有效的代码编写方式,因为您最终会分叉并执行大量进程,因此根据我的经验,您在典型的优化编译器中发现的优化往往不存在,因为他们并没有多大改善。提供更多的内置命令通常会更有效,从而完全不需要生成外部进程,并为您带来更多收益。