私が理解したように、インタプリタはコードを1行ずつ実行しますが、私の推論が間違っている可能性があることがわかります。この例では、最初の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が指摘したように、シェルは最初にコマンド全体を解析する必要があります。これは、コマンドがパイプにあるかバックグラウンドにある場合、コマンドの実行に影響を与えるためです。これは、シェルによって実行されるすべてのコマンドに対応します。インタラクティブなプロンプトで複数行のシェルコマンドを作成すると、コマンドが実行される前にコマンドが完了するのを待つため、非常に明白です。
シェルは各条件を正しく実行し、条件がtrueのときに停止します。追加の elif 条件は実行しません。 POSIX は Unix シェルの動作を明確に指定します。
シェルがより速く実行されるか、より効率的に実行されるように最適化されているかは、実装品質の問題です。小さなシェル(たとえば、busyboxのシェル)は少し遅くても可能な限り小さいものを好むが、他のシェルはより多くの最適化を好むかもしれません。
通常、シェルスクリプトは最終的に多くのプロセスを分岐して実行するため、コードを書くのは非常に効率的な方法ではありません。したがって、私の経験では、一般的な最適化コンパイラで見つかった最適化は存在しない傾向があります。改善されていないからです。たくさん。より多くの組み込みコマンドを提供することは、外部プロセスをまったく生成する必要性を排除し、費用対効果を高めることがより効率的です。