bash ケースの説明の最後の「esac」とはどういう意味ですか?それは必要ですか?

bash ケースの説明の最後の「esac」とはどういう意味ですか?それは必要ですか?

Bashのケースの説明の最後に表示される「esac」のいくつかの例を見つけましたが、その使用に関する明確な文書は見つかりませんでした。マニュアルページではこれを使用し、さらに単語のインデックス(https://www.gnu.org/software/bash/manual/bashref.html#index-esac)、しかしその目的を定義するものではありません。これがケースの説明を終了するための好ましい方法ですか、ベストプラクティスですか、それとも純粋に技術的ですか?

答え1

fiforifdoneforとfor同様に、esacステートメントを終了するのに適した方法ですcase

esac綴り法が逆になるcaseかのように逆に綴ります。ブロックを終了するトークンがなぜないのかわかりません。fiifforrof

答え2

このesacキーワードは実際にステートメントを終了するために必要な区切り文字であり、Unix / Linux(このシリーズを除く)で使用されるほとんどのシェルにありますcasebashcsh

オリジナルボンシェル創作者:スティーブバーン以前働いていた人アルゴリズム68。この言語はチャンクを分離するために逆ワード技術を発明しました。

case/esac

if/fi

do/od

後者はもう存在しませんが、do/odBournedo/doneとすべての派生シェルでUnixコマンドで最初bashから存在しました(odああケタールDナフ)。

機能ブロックはorディレクティブdo/doneによって導入されます。終了する必要がない場合は十分です。これが仮定とラベルを必要としない理由です。 forwhileuntilforwhileuntildonerofelihw

答え3

" esac"早く終了して " case" を構成します。コードブロック」。

Algol68でこれを使用するには、通常、キーワードを導入する文字の逆順を使用してカプセル化を終了します。( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

以降は「保護されたブロック」と呼びます。エズガー・デイクストラそして彼保護されたコマンド言語

odおそらく、既存のUnixのためにBourne Shellでは使用されていません。"od"コマンド

歴史:

「Guarded Block」のアイデアは以下のようです。 アルゴア68たとえば、英語:

proc days in month = (int year, month)int:

  case month in
    31,
    if year mod 4=0 ∧ year mod 100≠0  ∨  year mod 400=0 then 29 else 28 fi,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  esac;

旧ソ連Algol68 LGUの実装また同じことをします。英語でAlgol68の敬虔なケースステートメントは次のとおりです。case ~ in ~ out ~ esacキリル文字は次のとおりですвыб ~ в ~ либо ~ быв

その後、1975年にAlgol68のコードブロックを借りてきました。エズガー・デイクストラ彼のために保護されたコマンド言語。例えば

if a ≥ b → max := a
| b ≥ a → max := b
fi

おそらく、Dijstraはこれを克服するために「ガードブロック」を使用したでしょう。他にぶら下がってあいまいさは次のように実装されます。アルゴール60その後、再設計C言語。 (より移行 - 紛争を軽減します。)

最後に - Algol68で - " esac"が1977年に入力されました。ボンシェル(あなたが見つけた場所esac)丁寧スティーブンR.バーン彼は次の初期のAlgol68コンパイラを開発しました。アルゴア68C

Stephenはまた、次のような「Cヘッダファイル」で同じ保護ブロックを使用したことも知られています。マクロ

#define IF  if(
#define THEN    ){
#define ELSE    } else {
#define ELIF    } else if (
#define FI  ;}

有名なソフトウェア天才ランドンコーターノールそしてラリー・バーデル1984年にNational SemiconductorのGenix移植チームで働いていた間、彼は偶然にSteveのMacro.hコードを見つけ、そのアプリケーションを理解するのに苦労しました。それで、ランダンとラリーはこうして創造しました。国際難読化Cコード大会...

1984年から現在まで、数千Dijkstraの保護されたコマンドを使用しない他の「より良い」プログラミング言語。 Steven Bourneのこれらの使用は、macro.hIT学部生が講義中に眠っていないという証拠として、「ソフトウェア開発エッセイ」でよく引用されています。 :-)

答え4

はい、必須です。 Jacobが上で指摘したように、ロジックはif/と同じですfi。伝統的なCコメントの区切り記号/**/同様にペアになっています。 Cは最小限のアセンブリコードを使用してUnixをほとんどCで書くことができるように書かれています。文字ブロック区切り文字は、同じ文字順序の逆順でなければなりません。

代わりに、、、およびuse ...のようなループをfor使用whileします。until文字のdo順序doneを変更する代わりに、次のようにします。一部一貫性のない。

関連情報