elseチェーンがある場合、シェルスクリプトインタプリタは最適化されますか?

elseチェーンがある場合、シェルスクリプトインタプリタは最適化されますか?

私が理解したように、インタプリタはコードを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のシェル)は少し遅くても可能な限り小さいものを好むが、他のシェルはより多くの最適化を好むかもしれません。

通常、シェルスクリプトは最終的に多くのプロセスを分岐して実行するため、コードを書くのは非常に効率的な方法ではありません。したがって、私の経験では、一般的な最適化コンパイラで見つかった最適化は存在しない傾向があります。改善されていないからです。たくさん。より多くの組み込みコマンドを提供することは、外部プロセスをまったく生成する必要性を排除し、費用対効果を高めることがより効率的です。

おすすめ記事