
Bashのケースの説明の最後に表示される「esac」のいくつかの例を見つけましたが、その使用に関する明確な文書は見つかりませんでした。マニュアルページではこれを使用し、さらに単語のインデックス(https://www.gnu.org/software/bash/manual/bashref.html#index-esac)、しかしその目的を定義するものではありません。これがケースの説明を終了するための好ましい方法ですか、ベストプラクティスですか、それとも純粋に技術的ですか?
答え1
fi
forif
やdone
forとfor
同様に、esac
ステートメントを終了するのに適した方法ですcase
。
esac
綴り法が逆になるcase
かのように逆に綴ります。ブロックを終了するトークンがなぜないのかわかりません。fi
if
for
rof
答え2
このesac
キーワードは実際にステートメントを終了するために必要な区切り文字であり、Unix / Linux(このシリーズを除く)で使用されるほとんどのシェルにありますcase
。bash
csh
オリジナルボンシェル創作者:スティーブバーン以前働いていた人アルゴリズム68。この言語はチャンクを分離するために逆ワード技術を発明しました。
case/esac
if/fi
do/od
後者はもう存在しませんが、do/od
Bournedo/done
とすべての派生シェルでUnixコマンドで最初bash
から存在しました(od
ああケタールDナフ)。
機能ブロックはorディレクティブdo/done
によって導入されます。終了する必要がない場合は十分です。これが仮定とラベルを必要としない理由です。 for
while
until
for
while
until
done
rof
elihw
答え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.h
IT学部生が講義中に眠っていないという証拠として、「ソフトウェア開発エッセイ」でよく引用されています。 :-)
答え4
はい、必須です。 Jacobが上で指摘したように、ロジックはif
/と同じですfi
。伝統的なCコメントの区切り記号/*
も*/
同様にペアになっています。 Cは最小限のアセンブリコードを使用してUnixをほとんどCで書くことができるように書かれています。文字ブロック区切り文字は、同じ文字順序の逆順でなければなりません。
代わりに、、、およびuse ...のようなループをfor
使用while
します。until
文字のdo
順序done
を変更する代わりに、次のようにします。一部一貫性のない。