bash caseステートメントの最後の「esac」とはどういう意味ですか?必要ですか?


55

bashのcaseステートメントの最後に「esac」の例が複数あるのを見つけましたが、その使用に関する明確なドキュメントは見つかりませんでした。マニュアルページはそれを使用しており、単語(https://www.gnu.org/software/bash/manual/bashref.html#index-esac)のインデックスさえ持っていますが、その使用を定義していません。ケースステートメント、ベストプラクティス、または純粋なテクニックを終了するために必要な方法ですか?


2
esac正確に必要な場所のポイントのインデックスエントリ—定義し、必要であることを示す行へ。
ホッブズ

@hobbs、インデックスはその使用法を示す行を指しますが、特に「|」のような他の文字の使用法を説明する方法と比較して、どのようにも定義しません。または ";" または ";;"。答えを読んだので、逆スペルの「ケース」はコマンドを終了するための事実上の標準であるように見えます。
GrnMtnBuckeye

あなたが持っていないesacか、そのようなものがない場合、caseステートメントの終わりがどこにあるかをどのように伝えることができると思いますか?
バーマー

これは、構文の一部であるとして、それを定義するcaseのと同じ方法で、声明elseeliffiの構文の一部であると定義されているif声明。独自のセマンティクスを持たないため、何も言うことはありませんが、caseステートメントの定義の最後にあるので、caseステートメントの終わりです。case逆に綴られているという事実は便利な好奇心ですが、コンピューターは気にしません。特定の単語を探していることを知っているだけです。
ホッブズ

1
@hobbs「...それについて言うことは何もありません...」まだあなたはそれについて何も言わない理由の説明の段落を書いたところです。重要なことは、「esac」の意図を理解することです。そのため、この質問にはかなりの数の賛成票が寄せられています。
アンジェロ

回答:


99

同様fiのためifdoneのためforesac終了するために必要な方法であるcase文を。

esacされるcaseというように、後方に綴らfiれるif後方に綴ら。forブロックを終了するトークンがそうでない理由はわかりませんrof


33
ブロックodを終了しないのはなぜdoですか?:)
ワイルドカード

4
\odそのユーティリティを使用するたびに入力しなければならないことを想像してください!これはめったにありませんが、私のポイントは立っています;)
Score_Under

2
666からあなたを引き離しました。どういたしまして:P。そして素晴らしい答えです!
TheWanderer

12
@Wildcardでfiありneht、そうではないので、類推によりrof(またはelihw)であり、そうではありませんod(もちろん、odすでに取られています)...がある。
zwol

1
ROTFL何も言うことはありません
ゲルハルトd。

55

esac実際、このキーワードはcaseステートメントを終了するために必要な区切り文字でbashあり、Unix / Linuxで使用されるほとんどのシェルはcshファミリーを除きます。

オリジナルのBourneシェルは、以前ALGOL68で働いていたSteve Bourneによって作成されました。この言語は、ブロックを区切るためにこの逆ワード技術を発明しました。

case/esac

if/fi

do/od

後者は、それ以上ではないdo/odが、do/doneボーンを含むすべての派生シェルbashので、od既に創業(以降Unixコマンドとして存在したO CTAL D UMP)。

ことに注意してくださいdo/done機能ブロックはいずれかによって導入されているforwhileまたはuntil指示。forwhileおよび十分にuntil終了する必要はありませんdone。これが、仮説rofelihwトークンの必要がない理由です。


6

esac」は以前の「case」を終了して「コードブロック」を形成します

Algol68では、それらが使用されます。通常、エンクロージャーの終了には、導入キーワードの逆の文字シーケンスが使用されます。 ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

Edsger Dijkstraと彼のGuarded Command Languageにちなんで「Guarded Blocks」と呼びます。

odおそらく、UNIXの「od」コマンドがすでに存在していたため、Bourne Shellで使用されなかったと思われます。

歴史:

「保護されたブロック」のアイデアは、ALGOL 68から来たようです。 例:英語:

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

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

ソビエトのAlgol68 LGU実装も同じことを行いました。英語ではAlgol68の敬reなcase文の読み取りcase ~ in ~ out ~ esac、キリル文字ではこれが読み取りますвыб ~ в ~ либо ~ быв

その後、1975年に、Algol68のコードブロックがEdsger DijkstraGuarded Command Languageのために借りられました。例えば

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

おそらく、Dijstra は、Algol60で実装され、Cプログラミング言語で再設計されたDangling elseのあいまいさを克服するために、「Guarded Blocks」を使用したと考えられます。(shift-reduce conflictを参照してください

最後に、Algol68から-" esac" ALGOL 68Cと呼ばれる初期のAlgol68コンパイラを開発したStephen R. Bourneの好意により、1977年のBourneシェル(あなたが発見した場所esac)に入れました。

有名なスティーブンは、マクロと呼ばれる「Cヘッダーファイル」でこれらの同じ保護されたブロックも使用しました。

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

著名なソフトウェアの天才Landon Curt NollLarry Basselは、1984年にナショナルセミコンダクターのGenixポーティンググループで働いていたスティーブのmacro.hコードに偶然出会い、そのアプリケーションの理解に苦労しました。そして、Landon&Larryはその後、国際難読化Cコードコンテストを作成しました...

1984年から今日まで、ダイクストラの保護されたコマンドを使用しない他の「より良い」プログラミング言語が数千ありました。Steven Bourneによるそれらの使用はmacro.h、講義で眠っていなかった証拠としてIT学部生の「ソフトウェア開発学位論文」でしばしば引用されています。:-)


なにcase out?その構文を見たことがない
-Dani_l

1
@Dani_lこれは、Bourneシェルでは採用されていないAlgol68構文です。
jlliagre

odまだ取られていなかったのに、なぜ彼らはそれを呼ぶのですか?それはではないでしょうrofelihw
flarn2006

ピッキングdo ~ odif ~ fiそしてcase ~ esac単に学部生の無限の将来の世代がAlgol68を考えると、実際にページ(ライン?)Algol68コードの、より多くを記述することなく、その最終年度のプロジェクトにAlgol68の簡単な「批判」を追加することができますことを意味します。
-NevilleDNZ

1

はい、必須です。ジェイコブが上で指摘したように、その論理はif/ と同じfiです。従来のCコメント区切り文字/**/同様にペアになります。Cは、UnixがほとんどCで書かれ、最小限のアセンブリコードで、C開発チームとUnix開発チームとの間に大きな重複があるように書かれているため、マルチ-文字ブロック区切り文字は、逆の順序で同じ文字のシーケンスにする必要があります。

これとは対照的に、のようなループforwhileおよびuntil使用do... done代わりに、文字の順序を逆にするので、そこにあるいくつかの矛盾が。


3
構文はボーンから来ました。ボーンは再びALGOLに触発されました。
ルニウム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.